非动态SQL下按指定月份列求和填充YTD列的最优方法
无需动态SQL的YTD列计算方案
核心逻辑
由于表的月份列是固定的(2024M1至2024M4),直接通过CASE表达式结合变量判断每个月份列是否属于目标范围,将符合条件的列值累加即可,完全不需要动态SQL。
更新YTD列的代码实现
假设表名为monthly_data,定义目标月份变量后执行更新:
DECLARE @target_month VARCHAR(6) = '2024M3'; UPDATE monthly_data SET YTD = (CASE WHEN '2024M1' <= @target_month THEN [2024M1] ELSE 0 END) + (CASE WHEN '2024M2' <= @target_month THEN [2024M2] ELSE 0 END) + (CASE WHEN '2024M3' <= @target_month THEN [2024M3] ELSE 0 END) + (CASE WHEN '2024M4' <= @target_month THEN [2024M4] ELSE 0 END);
查询时实时计算YTD(无需更新表)
如果不需要持久化YTD值,仅在查询时计算:
DECLARE @target_month VARCHAR(6) = '2024M3'; SELECT [2024M1], [2024M2], [2024M3], [2024M4], (CASE WHEN '2024M1' <= @target_month THEN [2024M1] ELSE 0 END) + (CASE WHEN '2024M2' <= @target_month THEN [2024M2] ELSE 0 END) + (CASE WHEN '2024M3' <= @target_month THEN [2024M3] ELSE 0 END) + (CASE WHEN '2024M4' <= @target_month THEN [2024M4] ELSE 0 END) AS YTD FROM monthly_data;
关键说明
- 月份字符串
2024M1、2024M2等可以直接按字符串规则比较大小,无需额外转换日期格式,逻辑简单高效。 - 后续若新增月份列(如2024M5至2024M12),只需在CASE分支中添加对应列的判断即可,无需改动整体逻辑。
内容的提问来源于stack exchange,提问作者CraigA
相关产品推荐
相关产品推荐

