【问题标题】: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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-23
      • 2019-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多