问题描述
||
筛选后的表(代码)可能具有这些值
code_type date id
TM 1/1/2011 2342 (random unique id)
TM 2/1/2011 3298 (random unique id)
该表可能没有TM记录,一个TM记录,或者可能有两个TM记录(不再有)。
如果只有一个值,则我的输出需要像这样(空白或空值)。如果有两个记录,则将填写code2和date2字段。如果没有TM记录,则所有字段都必须为null或为空。
code_type1 date1 code_type2 date2
TM 1/1/2011
我正在选择子句中的子查询中执行此操作,不确定是否会有所不同。我在想我需要CASE语句吗?
使用SQL Server 2008
编辑:代码ID是随机的,不一定像我最初写的那样是1或2
解决方法
WITH YourQuery(code,[date],id) As
(
SELECT \'TM\',\'1/1/2011\',1 union all
SELECT \'TM\',\'2/1/2011\',2
),Numbered AS
(
SELECT *,ROW_NUMBER() OVER (ORDER BY id) RN
FROM YourQuery
)
SELECT
code1 = MAX(CASE WHEN RN=1 THEN code END),date1 = MAX(CASE WHEN RN=1 THEN [date] END),code2 = MAX(CASE WHEN RN=2 THEN code END),date2 = MAX(CASE WHEN RN=2 THEN [date] END)
FROM Numbered
,鉴于您的限制,即永远不会有2条以上的记录,因此仅使用标准SQL即可以跨平台的方式轻松实现;您只需要三英镑。
SELECT
Code1.Code_Type AS Code_Type1,Code1.Date AS Date1,Code2.Code_Type AS Code_Type2,Code2.Date AS Date2
FROM Code AS Code1
LEFT JOIN Code AS Code2
ON (Code1.Code_Type = Code2.Code_Type)
AND (Code1.ID < Code2.ID)
LEFT JOIN Code AS EarlierCode
ON (Code1.Code_Type = EarlierCode.Code_Type)
AND (Code1.ID > EarlierCode.ID)
WHERE
(EarlierCode.ID IS NULL)
这是假设使用“较低的ID”来确定哪个是“ code1”和哪个是“ code2”。如果是日期,则在每个“ 5”的最后一行中使用该日期。
一种解释,如果不清楚的话:从表中的每一行开始(Code1
)。然后,您将表两次连接到自身上:Code2
代表具有较高ID的任何内容(根据您的前提,其中只有一个),EarlierCode
代表较低的ID。因为如果您确实有两行,则不希望它两次(一次在Code1
中的值较早,而在Code2
中的值较晚,一次在Code1
和Code2
中的值保留为空),则您具有\'EarlierCode \',代表早于Code1
的事物。如果有一个,则将这一行省略(“ 14”子句)。
,SELECT
code1 = (SELECT code FROM TABLENAME WHERE id = 1),date1 = (SELECT [date] FROM TABLENAME WHERE id = 1),code2 = (SELECT code FROM TABLENAME WHERE id = 2),date2 = (SELECT [date] FROM TABLENAME WHERE id = 2)
您可以使用以下脚本对此进行测试:
DECLARE @code TABLE (
code char(2),[date] char(30),id int )
INSERT INTO @code (code,id) VALUES (\'TM\',1)
INSERT INTO @code (code,2)
SELECT
code1 = (SELECT code FROM @code WHERE id = 1),date1 = (SELECT [date] FROM @code WHERE id = 1),code2 = (SELECT code FROM @code WHERE id = 2),date2 = (SELECT [date] FROM @code WHERE id = 2)