首页 > 解决方案 > 总销售额,每个日期的 MTD 销售额

问题描述

需要显示 2019 年 6 月 13 日 - 2019 年 6 月 27 日期间每个日期的总销售额,以及每个日期(2019 年 6 月 1 日 - 当前日期)的 MTD 销售额。

这是我的查询:

select date, sum(sales) as 'Daily Sales', 
sum(sales) over (partition by datepart(month, date) order by date ROWS between unbounded preceding and current row) as 'MTD Sales' 
from Orders 
where date between '13/06/2019' and '27/06/2019'
group by date;

添加该where子句后,它将 MTD 销售额更改为仅从 13 日开始显示运行总计,而我希望 MTD 运行总计从 1 日开始。

这是所需的输出:

Date    | Daily Sales | MTD Sales
---------------------------------
13 June | 200         | 700
15 June | 300         | 1000
20 June | 500         | 1500

标签: sql-server

解决方案


因为在评估子句之后计算的窗口函数where,您必须将其作为两个查询执行。这是一个例子:

;with [MTD sales] as (
    select date, sum(sales) as 'Daily Sales', 
    sum(sales) over (partition by datepart(month, date) order by date ROWS between unbounded preceding and current row) as 'MTD Sales' 
    from Orders 
    group by date;
)
select *
from [MTD sales]
where date between '13/06/2019' and '27/06/2019'

这使用 CTE 运行计算正确的日期总和,然后在运行正确的计算后应用过滤作为第二步。


推荐阅读