DB2 - 使用 运行 总计来计算月累计销售额

DB2 - Using Running totals to calculate Month To Date Sales

我正在使用 DB2 代码计算月初至今的销售额,以比较 2019 年 7 月和 2018 年 7 月的总销售额。

当月的数据和去年同月的比较需要滚动,不然我是在比较两个不同时期的数据。

EG 如果它是静态的,我将比较 mtd 7 月(2019 年)第 2 周的销售额与 mtd 7 月第 4 周(2018 年)的销售额。

我需要 mtd 2019 年 7 月第 2 周与 mtd 7 月 (2018) 第 2 周 mtd 销售。

如何在 DB2 中获得 MTD 滚动销售?

我试过静态 MTD - 这是;然而,这不是理想的方法。对于滚动,我已经尝试了 sum() ,但这 returns 语法错误 (-119 & -727).

样本table

Year |Month | Week | Sales

2018 | July | 1 | 2000

2018 | July | 2 | 1500

2018 | July | 3 | 1000

2018 | July | 4 | 2000

2019 | July | 1 | 1750

2019 | July | 2 | 2100

预期结果

Year |Month | Week | Sales | Running Total


2018 | July | 1 | 2000 | 2000

2018 | July | 2 | 1500 | 3500

2018 | July | 3 | 1000 | 4500

2018 | July | 4 | 2000 | 6500

2019 | July | 1 | 1750 | 1750

2019 | July | 2 | 2100 | 3850

-- 从静态

收集到的结果不正确

Year |Month | Week | Sales | Running Total


2018 | July | 1 | 2000 | 6500

2018 | July | 2 | 1500 | 6500

2018 | July | 3 | 1000 | 6500

2018 | July | 4 | 2000 | 6500

2019 | July | 1 | 1750 | 3850

2019 | July | 2 | 2100 | 3850

来自静态的代码(有效但对于比较当前月份不正确):

Select
     a.Year,
     a.Month,
     a.Week,
     sum(a.sales) as weekly
     mtd.mtd_sales as MTD
from sales a 
inner join 
     (Select
          a.Year,
          a.Month,
          sum(a.sales) as mtd_sales
      from sales a
      group by
          a.Year,
          a.Month) MTD on MTD.week = a.week
group by
     a.Year,
     a.Month,
     a.Week,
     mtd.mtd;

我尝试使用以下代码进行滚动,但它会产生错误 (SQL State -119 & - 727),我认为这是语法错误。

滚动代码

Select
  a.Year,
  a.Month,
  a.Week,
  sum(a.sales) over (Partition by week order by 
month) 
from sales a
group by
    a.year,
    a.month,
    a.week;

只是 运行 window 函数 SUM() OVER(),在原始行级别而不是在聚合查询中。此外,调整 PARTITION BYORDER BY 子句,因为您的分组应该是 year and month and week 应该是排序列。

SELECT
  s.Year,
  s.Month,
  s.Week,
  s.Sales,
  SUM(s.sales) over (PARTITION BY s.Year, s.Month ORDER BY s.Week) as running_total
FROM sales s;

dbfiddle demo(使用Db2Developer-C11.1版本)