我有一张这样的表:
帐户 | 来源 | 九月 | 十月 | 十一月 |
---|---|---|---|---|
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] 删除。
我来说两句