You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

给定日历周,如何查询并展示一周全部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确保无数据的日期行也会保留,对应计数为0
  • TRUNC(l.GEN_DATUM)用于匹配天级日期,避免时分秒导致的关联失败
  • 可将SQL中的年份(示例为2024)和周数(37)替换为实际业务参数,或改为变量传入

内容的提问来源于stack exchange,提问作者craverealize

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 07:15:49