基于ID与Month分区、Audit条件的SQL聚合值计算技术问询
解决按
Id与Month分区的聚合计算问题 先理清楚你的需求和预期输出的核心规则:
- 保留源表的所有行(输出行数和源表一致)
- 按
Id和Month分区计算Total列:- 当
Audit为Yes时,Total显示该分区的聚合值(从你的预期输出看,Days=20时Total=100,推测是Days * 5的固定计算逻辑) - 当
Audit为No时,Total为空
- 当
- 注意到你的预期输出里
Hours和Days有部分值和源表不同(比如Id=1, Month=201803的Hours从30/15变成2/3;Id=1, Month=201802的Days从19变成10),如果这是需要实现的转换逻辑,可以补充说明细节,我再帮你调整。
针对Total列的核心聚合逻辑,修正后的SQL如下:
SELECT Id, Month, Days, -- 如果你需要把源表Hours转换为除以15后的值,解开下面注释替换原始Hours -- ROUND(Hours / 15, 0) AS Hours, Hours, Audit, CASE WHEN Audit = 'Yes' THEN MAX(Days) OVER (PARTITION BY Id, Month) * 5 ELSE NULL END AS Total FROM TABLEA;
如果你的Total实际需要计算分区内Days * Hours的总和(比如Id=1, Month=201803的总和是20*30 + 20*15 = 900),可以将CASE中的表达式替换为聚合求和:
SELECT Id, Month, Days, Hours, Audit, CASE WHEN Audit = 'Yes' THEN SUM(Days * Hours) OVER (PARTITION BY Id, Month) ELSE NULL END AS Total FROM TABLEA;
关键修正点说明:
- 必须显式选择所有需要输出的列(
Id、Month、Days、Hours、Audit),而不是仅返回Total - 窗口函数需要配合聚合函数(如
MAX()、SUM())使用,才能实现分区内的聚合计算,而不是直接在CASE后加OVER子句 - 通过
CASE语句精准控制Total列的显示逻辑:仅Audit='Yes'的行展示聚合值,其余行留空
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

