SQL使用联接并将一个联接中的两行与不同列中的值合并到一行
我将一些预测表与联接和案例结合起来,我有以下问题 我的最终结果需要是每个度量值一行 我从寄存器表中收集预测,它们位于单独的行中,如 夜间预报第1行,日间预报第2行 下面是我的示例SQL和更多信息 示例SQL稍微缩短了一点,整个SQL有4个内部联接和5个不同的表要联接在一起,但问题似乎只是来自寄存器表 有很多话题和这个有点相似,但我没有找到一个适合我的问题的解决方案。例如,使用Group By不适用于此案例 我错过了什么SQL使用联接并将一个联接中的两行与不同列中的值合并到一行,sql,sql-server,Sql,Sql Server,我将一些预测表与联接和案例结合起来,我有以下问题 我的最终结果需要是每个度量值一行 我从寄存器表中收集预测,它们位于单独的行中,如 夜间预报第1行,日间预报第2行 下面是我的示例SQL和更多信息 示例SQL稍微缩短了一点,整个SQL有4个内部联接和5个不同的表要联接在一起,但问题似乎只是来自寄存器表 有很多话题和这个有点相似,但我没有找到一个适合我的问题的解决方案。例如,使用Group By不适用于此案例 我错过了什么 SELECT MEASURE.KP as 'CSCS', Cont
SELECT
MEASURE.KP as 'CSCS', Contract.CustomerNumber as 'CN',
CASE
WHEN REGISTER.ID = '21' THEN REGISTER.FORECAST
WHEN REGISTER.ID = '1' THEN REGISTER.FORECAST
ELSE '0'
END AS 'ECsCt_DayForec',
CASE
WHEN REGISTER.ID = '22' THEN REGISTER.FORECAST
ELSE '0'
END AS 'ECsCt_NightForec'
FROM
MEASURE
INNER JOIN
REGISTER ON MEASURE.DEVICEID = REGISTER.DEVICEID
登记表
DeviceId ID Forecast
----------------------
1 21 220000
1 22 300000
当前查询结果:
CSCS CN ECsCt_DayForec ECsCt_NightForec
-------------------------------------------
4 3 0 220000
4 3 300000 0
我需要的结果
CSCS CN ECsCt_DayForec ECsCt_NightForec
-------------------------------------------
4 3 300000 220000
您的查询没有
合同
表。我假设这只是简化查询的一个错误
要解决您的问题,请使用聚合:
SELECT m.KP as CSCS, c.CustomerNumber as CN,
MAX(case when r.ID = '21' then r.FORECAST
when r.ID = '1' then r.FORECAST
else '0'
end) as ECsCt_DayForec,
MAX(case when r.ID = '22' then r.FORECAST
else '0'
end) as ECsCt_NightForec
FROM MEASURE m JOIN
REGISTER r
ON m.DEVICEID = r.DEVICEID
GROUP BY m.KP, c.CustomerNumber ;
注:
- 仅对字符串和日期使用单引号。不要将它们用作列名。您的列名不需要转义,所以我只是删除了它们
- 表别名使查询更易于编写和读取
- 我不知道
的数据类型。我猜这是某种数字。如果这是真的,请使用不带单引号的forecast
。不要混合使用字符串和数字类型0