我正在尝试找到一种更快、更简洁、更简单的方法来计算两个月/期间显示的金额的平均值。在我的数据集中,每个供应商有几个记录超过一年的时期,我想知道每个供应商的总金额的两个时期的平均值。
因此,如果供应商 ABC 在 1 月有两个帖子,2 月有 1 个帖子,3 月有 1 个帖子,我希望供应商 ABC 总共有两行。 第一个将显示 ABC 平均值(一月总数 + 二月总数)。第二行将显示 ABC 平均值(2 月总数和 3 月总数)。
我可以想到一种方法来做到这一点,就像下面这样(二月份):
select
CONCAT(YEAR(Date_Col),MONTH(Date_Col)) AS Date_Col
,Vendor_Col
,SUM(Amt_Col) AS Amt_Col
CASE
WHEN MONTH(Date_Col) = '02' THEN SUM(CASE
WHEN MONTH(Date_Col) = '02' or MONTH(Date_Col) = '01' THEN Amt_Col)/2 AS '2MonthAvg'
Group by Date_Col, Vendor_col
这意味着我必须制作 11 个单独的 WHEN 语句: 我认为分组会负责显示供应商级别 2 个月的平均值,但是有没有比上面更流畅的方法来使其动态化?
这是我正在处理的数据示例
Date_Col Vendor_col Amt_col
202201 ABC 150.789,41
202201 ABC 75.678,85
202201 DEF 845.678,45
202201 GHI 450.657,43
202202 ABC 50.694,45
202202 DEF 135.624,86
202202 DEF 123.250,15
202202 GHI 450.000,00
202203 ABC 12.600,50
202203 DEF 60.600,60
我希望我的问题是有道理的,如果我需要详细说明,请告诉我。
我还没有真正尝试过任何东西,因为我在弄清楚逻辑时遇到了麻烦,但是我一直在搞乱的是一个动态的
SUM(CASE WHEN
但我无法弄清楚如何让它动态地比较两个日期,因为我正在处理历史数据而不是 MontH(Today())。
我看到的输出是这样的:
Date_Col Vendor_col Amt_col
202201 ABC 226.468,30 (total Jan amt, since I want the average with prior month)
202201 DEF 845.678,45
202201 GHI 450.657,43
202202 ABC 138.581,36 ((sum of feb + sum of jan)/2)
202202 DEF 552.276,73
202202 GHI 450.328,72
202203 ABC 31.647,48 ((sum of mar + sum of jan)/2)
202203 DEF 159.737,81
我也研究过 LAG,但据我了解,LAG 会查看前一行,如果我有几个供应商项目,每个时期应该有独立的总和/平均值,这就没有意义了?