过滤后的表格(代码)可能包含这些值
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记录,则所有字段都必须为空或空。
code_type1 date1 code_type2 date2
TM 1/1/2011
我在select子句中的子查询中执行此操作,不确定这是否会产生任何影响。我想我需要一个CASE声明?
使用SQL Server 2008
编辑:代码ID是随机的,不一定是1或2,就像我最初写的那样
答案 0 :(得分:1)
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
答案 1 :(得分:1)
鉴于您的限制不会超过2条记录,只需标准SQL就可以跨平台方式轻松完成;您只需要LEFT JOIN
。
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'的方法。如果是日期,则在每个JOIN
的最后一行使用它。
解释,如果不清楚:从表格中的每一行开始(Code1
)。然后,您将表格连接到自身两次:Code2
代表具有更高ID的任何内容(根据您的前提条件,只会有其中一个),而EarlierCode
代表较低的ID。因为如果你有两行,你不需要它两次(一次使用Code1
中的较早值和Code2
中的较晚值,一次使用Code1
和{{{ 1}} left null),你有'EarlierCode',它代表早于Code2
的东西。如果有,则将该行留出(Code1
子句)。
答案 2 :(得分:0)
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, [date], id) VALUES ('TM', '1/1/2011', 1)
INSERT INTO @code (code, [date], id) VALUES ('TM', '2/1/2011', 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)