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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:23:55