SQL如何基于category和month字段分组创建计算列RA
回答
这个需求完全可以用SQL实现,用窗口函数就能搞定,不需要复杂的多表关联。
核心逻辑
- 把原表的
MDY字段重命名为输出要求的category - 按
MDY、month两个字段做分区,对每个分区内的Oa、Sa、Ai分别求和 - 做除法前先判断分区内Ai总和是否为0,为0直接返回0避免除零错误,否则按公式计算RA,结果保留2位小数即可和示例输出对齐
参考SQL
假设原表表名为your_table,代码如下:
SELECT Oa, Sa, Ai, month, MDY AS category, ROUND( CASE WHEN SUM(Ai) OVER (PARTITION BY MDY, month) = 0 THEN 0 ELSE (SUM(Oa) OVER (PARTITION BY MDY, month) + SUM(Sa) OVER (PARTITION BY MDY, month)) / SUM(Ai) OVER (PARTITION BY MDY, month) END, 2) AS RA FROM your_table;
结果验证
拿你举的J302022、Jan分组举例:
- 分区内Oa总和:5+16+46+46 = 113
- 分区内Sa总和:10+32+32+7 = 81
- 分区内Ai总和:2+38+81+81 = 202
- RA计算结果:(113+81)/202 ≈ 0.96,和你给出的示例值完全一致。Ai总和为0的分组(比如J302022的Mar组)会直接返回0,符合规则。
注:你给出的期望输出里有一行
46 7 81 Apr J302022 0.65,对照原表数据这行的MDY实际是J302021,属于手误,按上述代码运行时会基于原表真实字段值计算,不会出现这个匹配错误。
内容的提问来源于stack exchange,提问作者rra
相关产品推荐
相关产品推荐

