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

将周末销售数据汇总至下一个工作日的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分组汇总,再通过窗口函数计算累计值,实现周末销售额合并到下一个工作日的效果。

效果验证

针对你提供的示例数据,修改后的查询会返回:

dateRunningTotal
03/04/23379
04/04/23571
05/04/23739
06/04/23744

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 11:05:34