Sql server 以性能方式计算年度合计、期间合计、上年合计、上期合计

Sql server 以性能方式计算年度合计、期间合计、上年合计、上期合计,sql-server,window-functions,Sql Server,Window Functions,我有一张销售部的桌子。该表包含客户编号、日期和销售金额。 现在,我必须计算以下值——例如2019年1月1日和2019年3月31日 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分组 我怎样才能做到这一点呢?我可以在这种情况下使用窗口函数吗?不幸的是,在这种

我有一张销售部的桌子。该表包含客户编号、日期和销售金额。 现在,我必须计算以下值——例如2019年1月1日和2019年3月31日

  • 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分组


我怎样才能做到这一点呢?我可以在这种情况下使用窗口函数吗?

不幸的是,在这种情况下不能使用窗口函数,因为您不能使用日期在分区内移动,即将客户今天的所有销售额总和减去一个月。我认为不可能每天为每个客户都有一个事务(然后可以使用窗口功能)。我将从以下内容开始:

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
选择
客户号
,总和(当[日期]>='2019-01-01'和[日期]='2018-01-01'和[日期]='2019-01-01'和[日期]='2018-01-01'和[日期]时的情况)