如果有两个,则查询返回第二个值,如果只有一个则返回null

时间:2011-04-14 16:39:57

标签: 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字段。如果没有TM记录,则所有字段都必须为空或空。

code_type1   date1          code_type2     date2
TM       1/1/2011       

我在select子句中的子查询中执行此操作,不确定这是否会产生任何影响。我想我需要一个CASE声明?

使用SQL Server 2008

编辑:代码ID是随机的,不一定是1或2,就像我最初写的那样

3 个答案:

答案 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)