将行合并为具有值的一个ID

时间:2014-08-21 11:34:50

标签: sql sql-server

美好的一天,

我仍在学习SQL及其查询结构,但我遇到以下问题:

我有一个包含Id和时间的表,有些注册有多个ID,每个ID都有自己的日期时间戳。 我正在尝试构建一个查询,其中我只是尝试使用一个ID或两个链接到注册的单个注册。

这是表结构:

Registration    ID      DATETIME            IDType
Reg1            1001    16/07/2014 16:48    SFR
Reg1            1002    14/07/2014 12:04    TFR
Reg2            1004    16/07/2014 16:54    SFR
Reg2            1005    17/07/2014 09:16    TFR
Reg3            1006    14/07/2014 15:24    SFR
Reg4            1007    14/07/2014 14:27    SFR
Reg4            1008    14/07/2014 14:27    TFR
Reg5            1009    14/07/2014 13:00    SFR
Reg5            1010    17/07/2014 09:16    TFR
Reg6            1011    16/07/2014 16:48    SFR

以下是我通过查询回复的数据结构:

Registration    IDS     DATETIMES           IDT     DATETIMET
Reg1            NULL    NULL                1001    16/07/2014 16:48
Reg1            1002    14/07/2014 12:04    NULL    NULL
Reg2            NULL    NULL                1004    16/07/2014 16:54
Reg2            1005    17/07/2014 09:16    NULL    NULL
Reg3            1006    14/07/2014 15:24    NULL    NULL
Reg4            NULL    NULL                1007    14/07/2014 14:27
Reg4            1008    14/07/2014 14:27    NULL    NULL
Reg5            NULL    NULL                1009    14/07/2014 13:00
Reg5            1010    17/07/2014 09:16    NULL    NULL
Reg6            1011    16/07/2014 16:48    NULL    NULL

我想要实现的目标如下:

Registration    IDS     DATETIMES           IDT     DATETIMET
Reg1            1002    14/07/2014 12:04    1001    16/07/2014 16:48
Reg2            1005    17/07/2014 09:16    1004    16/07/2014 16:54
Reg3            1006    14/07/2014 15:24    NULL    NULL
Reg4            1008    14/07/2014 14:27    1007    14/07/2014 14:27
Reg5            1010    17/07/2014 09:16    1009    14/07/2014 13:00
Reg6            1011    16/07/2014 16:48    NULL    NULL

这是查询:

SELECT 
       UI.[Registration] 
      ,UI.Unit_ID AS MSTRACKUNITIDTWO
      ,CASE UI.[IDType]
        WHEN 'SFR' THEN UI.[ID]
       END AS IDS
      ,CASE UI.[IDType]
        WHEN 'SFR' THEN UI.[DATETIME]
       END AS DATETIMES
      ,CASE UI.[IDType]
        WHEN 'TFR' THEN UI.[ID]
       END AS IDT
      ,CASE UI.[IDType]
        WHEN 'TFR' THEN UI.[DATETIME]
       END AS DATETIMET
  FROM [InfoFleetSQL_PULS].[dbo].[UnitInfo] AS UI

任何帮助将不胜感激。

谢谢。

2 个答案:

答案 0 :(得分:2)

为了便于阅读,您可以将您的一张桌子视为两张;一个有sfr数据,一个有tfr数据:

select
  sfr.[Registration],
  sfr.[ID] as ids,
  sfr.[DATETIME] as datetimes,
  tfr.[ID] as idt,
  tfr.[DATETIME] as datetimet
from      (SELECT * FROM [UnitInfo] WHERE [IDType] = 'SFR') as sfr
left join (SELECT * FROM [UnitInfo] WHERE [IDType] = 'TFR') as tfr
  on sfr.[Registration] = tfr.[Registration];

这不是最快的解决方案,但非常清楚查询应该做什么。

答案 1 :(得分:1)

我认为你想使用聚合并使用MIN()或MAX()来组合值:

SELECT UI.[Registration], 
       MAX(UI.Unit_ID) AS MSTRACKUNITIDTWO
       MAX(CASE UI.[IDType] WHEN 'SFR' THEN UI.[ID] END) AS IDS,
       MAX(CASE UI.[IDType] WHEN 'SFR' THEN UI.[DATETIME] END) AS DATETIMES,
       MAX(CASE UI.[IDType] WHEN 'TFR' THEN UI.[ID] END) AS IDT,
       MAX(CASE UI.[IDType] WHEN 'TFR' THEN UI.[DATETIME] END) AS DATETIMET
FROM [InfoFleetSQL_PULS].[dbo].[UnitInfo] AS UI
GROUP BY UI.[Registration];