DB2中如何按星期维度聚合数据?需在现有查询中新增周内求和逻辑
可以在DB2中实现这个需求!
完全没问题,我们只需要利用DB2的日期函数来定位本周的起始日(周日),然后在原查询基础上新增聚合字段,就能同时保留每日总计、新增本周日到昨天的daily_total求和逻辑。下面是具体的实现方案:
核心逻辑拆解
DB2自带的DAYOFWEEK()函数刚好适配你的需求:它返回1代表周日、2代表周一……7代表周六。我们可以用这个函数算出本周日的日期:
CURRENT_DATE - (DAYOFWEEK(CURRENT_DATE) - 1 DAYS)
举个例子,如果今天是周三,DAYOFWEEK()会返回4,用当前日期减去3天就得到本周日的日期,刚好覆盖你需要的“周日-周二”统计范围。
修改后的完整查询
SELECT employee, -- 保留原有的每日总计(当前日期的Brown类别数据) SUM(CASE WHEN category = 'Brown' THEN daily_total ELSE 0 END) AS DailyBrownNumbers, SUM(CASE WHEN category = 'Brown' THEN weekly_quota ELSE 0 END) AS WeeklyBrownNumbers, -- 新增:本周日到昨天的Brown类别daily_total总和 SUM(CASE WHEN category = 'Brown' AND date_of_report >= (CURRENT_DATE - (DAYOFWEEK(CURRENT_DATE) - 1 DAYS)) AND date_of_report < CURRENT_DATE THEN daily_total ELSE 0 END) AS WeeklyBrownTotal, CURRENT_DATE AS DATE_OF_REPORT FROM dailyRecords WHERE date_of_report >= (CURRENT_DATE - (DAYOFWEEK(CURRENT_DATE) - 1 DAYS)) -- 调整条件确保包含本周所有数据 GROUP BY employee
关键调整说明
- WHERE条件优化:原查询只过滤当天的数据,现在改成从本周日开始,这样既能保留当天记录用于每日总计,也能包含本周历史数据用于周总计。
- 周总计字段实现:通过
CASE语句同时限定类别和日期范围,精准统计本周日到昨天的daily_total总和。 - 特殊场景兼容:如果当天是周日(
DAYOFWEEK()返回1),计算出的本周日就是当天,此时date_of_report < CURRENT_DATE会自动匹配上周日到周六的所有数据,完美贴合“周日至周六为一周”的统计规则。
效果验证示例
假设今天是2024年6月19日(周三):
- 计算出的本周日是2024年6月16日
- 查询会自动统计6月16日(周日)、17日(周一)、18日(周二)的
daily_total总和,同时保留6月19日的每日总计数据。
内容的提问来源于stack exchange,提问作者Geoff_S
相关产品推荐
相关产品推荐

