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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 13:18:06