如何在SQL中计算非连续数据的上年同月值并转换Excel SumIF语句
SQL实现Excel衍生字段(上年同月计算逻辑)
先从你给出的固定条件例子入手
你描述的PY列计算逻辑(固定2022年1月、站点A等条件),用SQL可以这么写:
SELECT SUM(M * W) / SUM(weight) AS PY FROM your_table_name -- 替换成你的实际表名 WHERE B = '2022-1' -- 假设B列是字符串格式的年月,比如'2022-1' AND C = '站点A' AND D = 'Flavor' AND E = 'Americas';
如果B列是日期类型(比如2022-01-15这种具体日期),需要用日期函数提取年月来筛选:
SELECT SUM(M * W) / SUM(weight) AS PY FROM your_table_name WHERE YEAR(B) = 2022 AND MONTH(B) = 1 AND C = '站点A' AND D = 'Flavor' AND E = 'Americas';
扩展到「上年同月」的动态计算
实际业务中一般不会固定年份,而是要自动匹配当前行/当前日期的上年同月,这里分两种常用场景:
场景1:按维度(站点、品类、区域)统计上年同月的PY值
如果你需要每个(C,D,E)组合对应的上年同月指标,用聚合函数+日期筛选即可:
SELECT C AS 站点, D AS 品类, E AS 区域, -- 处理除数为0的情况,避免报错 CASE WHEN SUM(weight) = 0 THEN NULL ELSE SUM(M * W) / SUM(weight) END AS PY_上年同月 FROM your_table_name WHERE -- 筛选上年同月的数据 -- 若B是日期类型: DATE_TRUNC('month', B) = DATE_TRUNC('month', CURRENT_DATE) - INTERVAL '1 year' -- 若B是字符串年月(比如'2023-1'): -- B = TO_CHAR(CURRENT_DATE - INTERVAL '1 year', 'YYYY-MM') GROUP BY C, D, E; -- 按你的维度分组
场景2:给每行数据带上对应的上年同月PY值
如果要在原表的基础上,每行都显示其对应维度的上年同月指标,可以用关联子查询:
SELECT t1.*, (SELECT CASE WHEN SUM(t2.weight) = 0 THEN NULL ELSE SUM(t2.M * t2.W) / SUM(t2.weight) END FROM your_table_name t2 WHERE -- 匹配上年同月 DATE_TRUNC('month', t2.B) = DATE_TRUNC('month', t1.B) - INTERVAL '1 year' -- 匹配相同的维度 AND t2.C = t1.C AND t2.D = t1.D AND t2.E = t1.E) AS PY_上年同月 FROM your_table_name t1;
关键注意点
- 日期格式适配:根据你B列的实际格式(字符串/日期类型)选择对应的筛选方式,确保年月匹配准确。
- 除数为0处理:如果
weight列的总和可能为0,一定要加CASE WHEN判断,否则会触发除法报错。 - 维度匹配:如果你的业务还有其他分组维度(比如产品类型),要在
GROUP BY和子查询的匹配条件里加上对应的字段。
内容的提问来源于stack exchange,提问作者KGP Vertiv
相关产品推荐
相关产品推荐

