DB2 - 使用运行总计来计算本月至今的销售额
Posted
技术标签:
【中文标题】DB2 - 使用运行总计来计算本月至今的销售额【英文标题】:DB2 - Using Running totals to calculate Month To Date Sales 【发布时间】:2019-07-15 17:18:39 【问题描述】:我正在使用 DB2 代码计算当月至今的销售额,以比较 2019 年 7 月与 2018 年 7 月的总数。
需要滚动比较当前月份的数据和去年同月的数据,否则我是在比较两个不同时期的数据。
如果它是静态的,我将比较 mtd 七月(2019 年)第 2 周的销售额与 mtd 七月第 4 周(2018 年)的销售额。
我需要 mtd 2019 年 7 月第 2 周与 mtd 7 月(2018 年)第 2 周 mtd 销售。
如何在 DB2 中获得 MTD 滚动销售?
我尝试了一个静态 MTD - 这是 ;但是,这不是理想的方法。对于滚动,我尝试过 sum() ,但这会返回语法错误(-119 和 -727)。
示例表
年 |月 |周 |销售
2018 |七月 | 1 | 2000
2018 |七月 | 2 | 1500
2018 |七月 | 3 | 1000
2018 |七月 | 4 | 2000
2019 |七月 | 1 | 1750
2019 |七月 | 2 | 2100
预期结果
年 |月 |周 |销售 |运行总计
2018 |七月 | 1 | 2000 | 2000
2018 |七月 | 2 | 1500 | 3500
2018 |七月 | 3 | 1000 | 4500
2018 |七月 | 4 | 2000 | 6500
2019 |七月 | 1 | 1750 | 1750
2019 |七月 | 2 | 2100 | 3850
-- 从静态中收集到的错误结果
年 |月 |周 |销售 |运行总计
2018 |七月 | 1 | 2000 | 6500
2018 |七月 | 2 | 1500 | 6500
2018 |七月 | 3 | 1000 | 6500
2018 |七月 | 4 | 2000 | 6500
2019 |七月 | 1 | 1750 | 3850
2019 |七月 | 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 状态 -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;
【问题讨论】:
什么平台和版本的 Db2? 有没有一种简单的方法可以检查 SQuirreL SQL 客户端以验证什么版本? 【参考方案1】:只需在原始行级别而不是在聚合查询内运行窗口函数SUM() OVER()
。此外,调整 PARTITION BY
和 ORDER BY
子句,因为您的分组应该是 year 和 month 并且 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(使用 Db2 Developer-C 11.1 版本)
【讨论】:
以上是关于DB2 - 使用运行总计来计算本月至今的销售额的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server Reporting Services 在聚合数据上运行总计