【问题标题】:Calculate Year-Total, Period-Total and Previous-Year-Total and Previous-Period-Total in a performante way以性能方式计算年度总计、期间总计和上一年总计和上一期间总计
【发布时间】:2019-05-21 17:59:31
【问题描述】:
我有一张销售表。该表包含销售的客户编号、日期和金额。
现在,我必须计算以下值 - 例如,期间 01/01/2019 和 03/31/2019
- 2019 年 1 月 1 日至 2019 年 3 月 31 日的总计(=期间总计)
- 2018 年 1 月 1 日至 2018 年 3 月 31 日的总计(= 上一年期间的总计)
- 2019 年 1 月 1 日至 2019 年 12 月 31 日的总计(= 年总计)
- 2018 年 1 月 1 日至 2018 年 12 月 31 日的总计(= 上一年总计)
所有这些值都按 CustomerNo 分组。
我怎样才能以高性能的方式做到这一点?我可以在这种情况下使用窗口函数吗?
【问题讨论】:
标签:
sql-server
window-functions
【解决方案1】:
不幸的是,在这种情况下不能使用窗口函数,因为您不能使用日期在分区内移动,即,将客户今天减去一个月的所有销售额相加。我想不可能每天为每个客户进行交易(然后可以使用窗口函数)。我会从这样的开始:
select
CustomerNo
,sum(case when [Date] >= '2019-01-01' and [Date] <= '2019-03-31' then Amount else 0 end ) as PeriodTotal
,sum(case when [Date] >= '2018-01-01' and [Date] <= '2018-03-31' then Amount else 0 end ) as PreviousYearPeriodTotal
,sum(case when [Date] >= '2019-01-01' and [Date] <= '2019-12-32' then Amount else 0 end ) as YearTotal
,sum(case when [Date] >= '2018-01-01' and [Date] <= '2018-12-32' then Amount else 0 end ) as PreviousYearTotal
from sales
group by CustomerNo