美好的一天,
我仍在学习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
任何帮助将不胜感激。
谢谢。
答案 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];