Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如果有两个,则查询返回第二个值;如果只有一个,则返回null_Sql_Sql Server - Fatal编程技术网

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”。它们可以是任何唯一的值。