Sql 如果有两个,则查询返回第二个值;如果只有一个,则返回null
过滤后的表(代码)可能有以下值Sql 如果有两个,则查询返回第二个值;如果只有一个,则返回null,sql,sql-server,Sql,Sql Server,过滤后的表(代码)可能有以下值 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字段
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
我在select子句的子查询中执行此操作,不确定这是否会产生任何影响。我想我需要一份案情陈述
使用SQLServer2008
编辑:代码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
您可以使用以下脚本对此进行测试:
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)
考虑到您的限制,即永远不会有超过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)
选择
代码1.代码类型为代码类型1,
代码1.日期为日期1,
代码2.代码类型为代码类型2,
代码2.日期为日期2
从代码改为代码1
左连接代码为Code2
打开(代码1.Code\u类型=代码2.Code\u类型)
和(代码1.ID<代码2.ID)
左连接代码为EarlierCode
ON(Code1.Code\u Type=EarlierCode.Code\u Type)
和(Code1.ID>EarlierCode.ID)
哪里
(EarlierCode.ID为空)
这是假设“较低的ID”是确定哪个是“代码1”,哪个是“代码2”的方法。如果是日期,则在每个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)
如果不清楚,请说明:从表中的每一行开始(
Code1
)。然后将表自身联接两次:Code2
表示ID较高的任何内容(根据您的premis,只有一个ID),而EarlierCode
表示ID较低的内容。因为如果您有两行,您不需要两次(一次在Code1
中使用较早的值,一次在Code2
中使用较晚的值,一次在Code1
中使用较晚的值,一次在Code2
中保留null),您有“EarlierCode”,它表示早于Code1
的内容。如果有,请将该行删去(WHERE子句)。我遗漏了什么吗?“代码1/2”从何处提取?(它们来自ID列吗?)我编辑了原始代码表。Code1/code2应该来自代码表的code_type列。所以我的答案应该适合你。@FreeAsInBeer:建设性的批评会很好,而不是屈尊俯就。此外,如果您可以更好地发布您的版本。如果id=1和id=2的行被删除,则查询将返回所有空值。我很确定这个查询不会“失败”。再次阅读用户的问题…我认为您对问题的理解“失败了”。我的“对问题的理解”是正确的。永远不要编写依赖于具有特定值的字段的查询。这两行都可以有任意数字作为id,因此您应该只选择所有数据,而不使用WHERE
子句。我道歉。ID不一定是“1”和“2”。它们可以是任何唯一的值。