给定日历周,如何查询并展示一周全部7天的统计数据
解决方案
要实现目标周7天全部展示(无论是否有数据),核心是先生成该周的完整日期序列,再通过左连接关联业务表统计数据,具体步骤如下:
1. 生成目标周的7个日期
以Oracle为例,提供两种常用的连续日期生成方式:
方式一:层级查询(CONNECT BY)
先计算目标周的起始日期,再生成后续6天的日期:
WITH week_dates AS ( SELECT -- 按ISO周(周一为一周首日)计算起始日期,若需匹配原SQL的WW(周日为首日),替换为TRUNC(TO_DATE('2024' || '37', 'YYYYWW'), 'WW') TRUNC(TO_DATE('2024' || '37', 'IYYYIW'), 'IW') + LEVEL - 1 AS gen_datum FROM dual CONNECT BY LEVEL <=7 )
方式二:递归CTE
WITH week_dates(gen_datum) AS ( SELECT TRUNC(TO_DATE('2024' || '37', 'IYYYIW'), 'IW') FROM dual UNION ALL SELECT gen_datum + 1 FROM week_dates WHERE gen_datum +1 < TRUNC(TO_DATE('2024' || '37', 'IYYYIW'), 'IW') +7 )
2. 关联业务表统计数据
将生成的日期序列左连接业务表,按日期分组统计各类型数量:
WITH week_dates AS ( SELECT TRUNC(TO_DATE('2024' || '37', 'IYYYIW'), 'IW') + LEVEL - 1 AS gen_datum FROM dual CONNECT BY LEVEL <=7 ) SELECT TO_CHAR(w.gen_datum, 'DD.MM.YYYY') AS GRD_ROW_ID, COUNT(DISTINCT CASE WHEN l.ART =1 THEN l.LP_BELEGUNG_ID END) AS ANZAHL_ART_1, COUNT(DISTINCT CASE WHEN l.ART =2 THEN l.LP_BELEGUNG_ID END) AS ANZAHL_ART_2, COUNT(DISTINCT CASE WHEN l.ART =3 THEN l.LP_BELEGUNG_ID END) AS ANZAHL_ART_3, COUNT(DISTINCT CASE WHEN l.ART =99 THEN l.LP_BELEGUNG_ID END) AS ANZAHL_ART_4 FROM week_dates w LEFT JOIN LP_BELEGUNG l ON w.gen_datum = TRUNC(l.GEN_DATUM) GROUP BY w.gen_datum ORDER BY w.gen_datum;
关键细节
LEFT JOIN确保无数据的日期行也会保留,对应计数为0TRUNC(l.GEN_DATUM)用于匹配天级日期,避免时分秒导致的关联失败- 可将SQL中的年份(示例为2024)和周数(37)替换为实际业务参数,或改为变量传入
内容的提问来源于stack exchange,提问作者craverealize
相关产品推荐
相关产品推荐

