You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 21:25:22