SQL使用联接并将一个联接中的两行与不同列中的值合并到一行

SQL使用联接并将一个联接中的两行与不同列中的值合并到一行,sql,sql-server,Sql,Sql Server,我将一些预测表与联接和案例结合起来,我有以下问题 我的最终结果需要是每个度量值一行 我从寄存器表中收集预测,它们位于单独的行中,如 夜间预报第1行,日间预报第2行 下面是我的示例SQL和更多信息 示例SQL稍微缩短了一点,整个SQL有4个内部联接和5个不同的表要联接在一起,但问题似乎只是来自寄存器表 有很多话题和这个有点相似,但我没有找到一个适合我的问题的解决方案。例如,使用Group By不适用于此案例 我错过了什么 SELECT MEASURE.KP as 'CSCS', Cont

我将一些预测表与联接和案例结合起来,我有以下问题

我的最终结果需要是每个度量值一行

我从寄存器表中收集预测,它们位于单独的行中,如 夜间预报第1行,日间预报第2行

下面是我的示例SQL和更多信息

示例SQL稍微缩短了一点,整个SQL有4个内部联接和5个不同的表要联接在一起,但问题似乎只是来自寄存器表

有很多话题和这个有点相似,但我没有找到一个适合我的问题的解决方案。例如,使用Group By不适用于此案例

我错过了什么

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
    。不要混合使用字符串和数字类型

夜间预测第1行,日间预测第2行,这意味着夜间预测总是在奇数行,日间预测总是在偶数行?或者根据您的SQL,这意味着白天预测和夜间预测的ID总是奇数?可能是矛盾的,不是吗?告诉我们更多关于您如何确定某个内容是夜间预测还是白天预测的信息。我认为您的解决方案是有效的,添加Max()就成功了。正如您所注意到的那样,我简化了查询导致了一些格式问题,但这个原则起了作用。也谢谢你的笔记,我会使用它们的。