我今天遇到了一个有趣的SQL问题,虽然我想出了一个可行的解决方案,但我怀疑它不是最好或最高效的答案。我请教专家们-帮助我学习并改进我的查询!RDBMS是SQL Server 2008 R2,查询是SSRS报告的一部分,将运行大约10万行。
基本上,我有一个ID列表,这些ID可能与多个值相关联,这些值为Yes,No或其他字符串。对于ID x,如果任何值为Yes,则x应为Yes,如果它们全部为No,则应为No,如果它们包含除yes和no之外的任何其他值,请显示该值。我只想返回每个ID的1行,没有重复。
简化版本和测试用例:
基本上,我有一个ID列表,这些ID可能与多个值相关联,这些值为Yes,No或其他字符串。对于ID x,如果任何值为Yes,则x应为Yes,如果它们全部为No,则应为No,如果它们包含除yes和no之外的任何其他值,请显示该值。我只想返回每个ID的1行,没有重复。
简化版本和测试用例:
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
非常感谢预先的帮助。
10=>Y; 10=>N; 10=>F; 10=>S; 10=>P
,那么应该发生什么?在这种情况下应该显示什么? - trailmax