将周末销售数据汇总至下一个工作日的SQL实现需求
解决方案
要实现将周末(周六、周日)销售额汇总至下一个工作日,核心是给每个日期映射到对应的目标工作日,再按该工作日分组计算总和,最后生成累计值。以下是修改后的完整查询:
;with date_cur_month as( -- 生成当月所有日期 select convert(datetime, convert(varchar(6), getdate(), 112) + '01', 112) as dt union all select dateadd(day, 1, dt) as dt from date_cur_month where datepart(month, dateadd(day, 1, dt)) = datepart(month, getdate()) ), date_with_workday as( -- 给每个日期映射到对应的下一个工作日 select dt, case -- ISO周几规则:周一=1,周日=7,不受系统语言环境影响 when datepart(iso_weekday, dt) = 6 then dateadd(day, 2, dt) -- 周六映射到下周一 when datepart(iso_weekday, dt) = 7 then dateadd(day, 1, dt) -- 周日映射到下周一 else dt -- 工作日保留原日期 end as target_workday from date_cur_month ), daily_sales as( -- 计算每天的销售额,无订单日期填充为0 select dw.target_workday, isnull(sum(ci.C_PRETAXTOTAL), 0) as daily_total from date_with_workday dw left join [T_SALESORDER] ci on cast(ci.C_DATE as date) = dw.dt and ci.C_SALESREP = '8602832427308' -- 将销售代表条件移至JOIN,避免过滤空订单日期 group by dw.target_workday ) -- 按目标工作日分组,计算累计销售额 select convert(nvarchar(8), target_workday, 3) as date, sum(daily_total) over(order by target_workday) as RunningTotal from daily_sales where target_workday <= cast(getdate() as date) -- 可选:仅显示到当前日期的数据 order by target_workday;
关键修改说明
- 日期映射逻辑:使用
iso_weekday判断周几,避免系统语言环境对weekday函数的影响,准确将周六、周日映射到下一个周一。 - 空订单日期处理:通过
LEFT JOIN+isnull确保无订单的日期销售额为0,不会丢失日期记录。 - 分组与累计:按映射后的
target_workday分组汇总,再通过窗口函数计算累计值,实现周末销售额合并到下一个工作日的效果。
效果验证
针对你提供的示例数据,修改后的查询会返回:
| date | RunningTotal |
|---|---|
| 03/04/23 | 379 |
| 04/04/23 | 571 |
| 05/04/23 | 739 |
| 06/04/23 | 744 |
内容的提问来源于stack exchange,提问作者James Davis
相关产品推荐
相关产品推荐

