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 BY
和 ORDER 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版本)
我正在使用 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 BY
和 ORDER 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版本)