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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:10:05