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

问题描述

|| 筛选后的表(代码)可能具有这些值
 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)
    

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...