SQL Server 分组时的条件行总和

古斯塔夫·林斯特伦

我有一张这样的表:

帐户 来源 九月 十月 十一月
1 预报 110 230 310
1 结果 130 空值 空值
2 预报 190 440 590
2 结果 200 空值 空值

如果我在 9 月有一个“结果”,我想使用它,如果没有,我想使用 9 月的预测并按帐号分组。

有谁知道如何生产类似下面的东西?

帐户 九月 十月 十一月
1 130 230 310
2 200 440 590

有时没有结果行。

我尝试了不同的案例陈述和合并,但没有成功的结果。

谢谢!

拉胡尔·比斯瓦斯

由于表中存在两种类型的源,因此使用子查询将返回帐户明智的结果和预测值。使用 COALESCE(),其中首先放置结果值,然后在其次放置预测值。

-- SQL Server
SELECT t.account, COALESCE(t.r_Sep, t.f_Sep) "Sep"
     , COALESCE(t.r_Oct, t.f_Oct) "Oct"
     , COALESCE(t.r_Nov, t.f_Nov) "Nov"
FROM (SELECT account
           , MAX(CASE WHEN source = 'Result' THEN Sep END) "r_Sep"
           , MAX(CASE WHEN source = 'Forecast' THEN Sep END) "f_Sep"
           , MAX(CASE WHEN source = 'Result' THEN Oct END) "r_Oct"
           , MAX(CASE WHEN source = 'Forecast' THEN Oct END) "f_Oct"
           , MAX(CASE WHEN source = 'Result' THEN Nov END) "r_Nov"
           , MAX(CASE WHEN source = 'Forecast' THEN Nov END) "f_Nov"
      FROM tbl
      GROUP BY account) t

使用 COALESCE() 时的另一种方法,首先放置结果的最大值,然后是预测的最大值。

-- SQL Server
SELECT account
     , COALESCE(MAX(CASE WHEN source = 'Result' THEN Sep END), MAX(CASE WHEN source = 'Forecast' THEN Sep END)) "Sep"
     , COALESCE(MAX(CASE WHEN source = 'Result' THEN Oct END), MAX(CASE WHEN source = 'Forecast' THEN Oct END)) "Sep"
     , COALESCE(MAX(CASE WHEN source = 'Result' THEN Nov END), MAX(CASE WHEN source = 'Forecast' THEN Nov END)) "Sep"
FROM tbl
GROUP BY account

请从网址https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=5e96ed33a6d9265739c3b935e5f6824a查看

注意:您可以获得“警告:空值被聚合或其他 SET 操作消除”消息,只需忽略它。这不是错误

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章