【发布时间】:2011-11-04 18:45:02
【问题描述】:
我正在尝试做类似的事情 How can I improve this SQL query?
但是,在逻辑上 本质上,我有一个 ID 列表,其中可能有多个与其关联的值,这些值是 Yes、No 或其他一些字符串。 对于 ID x,如果任何值是 Yes,x 应该是 Yes,如果它们都是 No,它应该是 No,如果它们包含除 yes 和 no 之外的任何其他值,则显示该值。我只想返回每个 ID 1 行,没有重复。
但在我的逻辑中,如果所有值都是yes,则显示yes,如果所有值都不是,则显示no,如果它是yes、no 或其他任何内容的混合,则显示混合
DECLARE @tempTable table ( ID int, Val varchar(1) )
INSERT INTO @tempTable ( ID, Val ) VALUES ( 10, 'Y')
INSERT INTO @tempTable ( ID, Val ) VALUES ( 11, 'N')
INSERT INTO @tempTable ( ID, Val ) VALUES ( 11, 'N')
INSERT INTO @tempTable ( ID, Val ) VALUES ( 12, 'Y')
INSERT INTO @tempTable ( ID, Val ) VALUES ( 12, 'Y')
INSERT INTO @tempTable ( ID, Val ) VALUES ( 12, 'Y')
INSERT INTO @tempTable ( ID, Val ) VALUES ( 13, 'N')
INSERT INTO @tempTable ( ID, Val ) VALUES ( 14, 'Y')
INSERT INTO @tempTable ( ID, Val ) VALUES ( 14, 'N')
INSERT INTO @tempTable ( ID, Val ) VALUES ( 15, 'Y')
INSERT INTO @tempTable ( ID, Val ) VALUES ( 16, 'Y')
INSERT INTO @tempTable ( ID, Val ) VALUES ( 17, 'F')
INSERT INTO @tempTable ( ID, Val ) VALUES ( 18, 'P')
SELECT DISTINCT t.ID, COALESCE(t2.Val, t3.Val, t4.Val)
FROM @tempTable t
LEFT JOIN
(
SELECT ID, Val
FROM @tempTable
WHERE Val = 'Y'
) t2 ON t.ID = t2.ID
LEFT JOIN
(
SELECT
ID, Val FROM @tempTable
WHERE Val = 'N'
) t3 ON t.ID = t3.ID
LEFT JOIN
(
SELECT ID, Val
FROM @tempTable
WHERE Val <> 'Y' AND Val <> 'N'
) t4 ON t.ID = t4.ID
Update dbo.households
SET dbo.households.code = #TempTable.code
FROM #TempTable
WHERE dbo.households.id = #TempTable.id
【问题讨论】:
-
由于某种原因,如果结果为 N,N,P 它仍然显示 N 或者如果它出现 Y,N 它会显示 Y。我希望 Y,Y 以 Y 和 N 的形式出现,N 以 N 形式出现,其他一切以 'M' 形式出现
标签: sql tsql stored-procedures sql-server-2000