SQL Server按Account分组时优先取Result值的条件汇总实现
实现方案
通用SQL写法(兼容所有主流数据库)
这种写法用分组聚合+条件判断实现,不需要数据库支持窗口函数,兼容性最高:
SELECT Account, COALESCE( MAX(CASE WHEN Source = 'Result' THEN Sep END), MAX(CASE WHEN Source = 'Forecast' THEN Sep END) ) AS Sep, MAX(CASE WHEN Source = 'Forecast' THEN Oct END) AS Oct, MAX(CASE WHEN Source = 'Forecast' THEN Nov END) AS Nov FROM 你的表名 GROUP BY Account;
逻辑说明
- 按
Account分组后,每个分组内最多存在2行数据:1行Source=Result、1行Source=Forecast - 对于
Sep字段:用CASE筛选出Result行的Sep值,聚合后如果为NULL(说明该账号无Result行),就取Forecast行的Sep值 - 对于
Oct、Nov字段:直接筛选Forecast行的对应值返回即可,Result行的这两个字段本身为NULL不影响结果
窗口函数写法(适用于MySQL8.0+、PostgreSQL、SQL Server等支持窗口函数的数据库)
如果需要保留更多原表字段,或者后续有扩展逻辑,可以用窗口函数实现:
WITH account_ranked AS ( SELECT Account, Sep, Oct, Nov, Source, -- 给同账号下的行排序,Result优先级高于Forecast ROW_NUMBER() OVER (PARTITION BY Account ORDER BY CASE Source WHEN 'Result' THEN 1 ELSE 2 END) AS rn, -- 提前取到Forecast的Oct、Nov值 MAX(CASE WHEN Source = 'Forecast' THEN Oct END) OVER (PARTITION BY Account) AS f_oct, MAX(CASE WHEN Source = 'Forecast' THEN Nov END) OVER (PARTITION BY Account) AS f_nov FROM 你的表名 ) SELECT Account, Sep, f_oct AS Oct, f_nov AS Nov FROM account_ranked WHERE rn = 1;
注意事项
如果你的表中同一个Account下存在多条相同Source的记录,需要先按照业务逻辑对同Account同Source的数据做预聚合(求和/取均值等),再执行上述逻辑。
内容的提问来源于stack exchange,提问作者Gustav Lindström
相关产品推荐
相关产品推荐

