DayOfWeek函数使用错误排查:周工作日聚合SQL查询问题
问题分析与解决方案
首先,你的查询报错“函数使用无效”有直接的语法问题,同时dayofweek的逻辑也存在偏差,加上WHERE条件的范围限制,导致无法得到预期结果,下面分点拆解并给出修正方案:
1. 嵌套聚合函数导致的语法错误
你在第三列的CASE语句里嵌套了sum(daily_total),但外层已经用了SUM()做聚合——在同一个SELECT的聚合层级中,不能直接嵌套使用聚合函数(除非借助子查询或窗口函数,但这里完全不需要)。正确的做法是在CASE里直接返回daily_total,外层的SUM会自动累加所有符合条件的数值。
2. DayOfWeek函数的逻辑偏差
不同数据库的dayofweek返回规则不一样:
- 比如DB2中,
dayofweek(current date)返回1代表周日,2代表周一,周五对应6; - MySQL里,
dayofweek()返回1是周日,weekday()返回0才是周一。
你原来的计算current date - (dayofweek(current date) - 1) days,以2019-08-30(周五)为例,会得到2019-08-30 - 5 = 2019-08-25(上周日),但你需要的是本周一(2019-08-26),所以得调整计算逻辑:
- 若用DB2(周日=1):本周一的日期应为
current date - (dayofweek(current date) - 2) days; - 若用MySQL:直接用
current_date - interval weekday(current_date) day就能得到本周一。
3. WHERE条件的范围错误
你原来的WHERE date_of_report >= current_date只会筛选当天的数据,导致本周统计根本拿不到周一到周四的记录,必须把WHERE条件调整为包含本周的日期范围,才能正确计算累计值。
修正后的SQL示例(以DB2为例)
SELECT employee, -- 统计当日Shoes的总和 SUM(CASE WHEN category = 'Shoes' AND date_of_report = current_date THEN daily_total ELSE 0 END) AS shoes_daily, -- 统计本周截至当日Shoes的总和 SUM(CASE WHEN category = 'Shoes' AND date_of_report >= current_date - (dayofweek(current_date) - 2) days THEN daily_total ELSE 0 END) AS dailyTotalWeek FROM shoeTotals -- 只查询本周数据,提升查询性能 WHERE date_of_report >= current_date - (dayofweek(current_date) - 2) days GROUP BY employee;
验证示例数据
当执行日期为2019-08-30(周五):
current_date - (dayofweek(current_date) - 2) days= 2019-08-30 - (6-2) = 2019-08-26(周一);shoes_daily统计的是当日数值8;dailyTotalWeek统计的是周一到周五的总和:14+1+56+6+8=85,完全符合你的期望输出。
如果你的数据库是其他类型(比如MySQL),只需要调整dayofweek相关的日期计算逻辑即可,核心思路保持一致。
内容的提问来源于stack exchange,提问作者Geoff_S
相关产品推荐
相关产品推荐

