我有一个包含多行和多列的表。它看起来像这样:
Name Description
X PASS
X PASS
X FAIL
我希望它只返回一行。如果所有这些都是PASS,则返回PASS。 如果其中一个或多个失败,则返回FAIL。
在SQL Server 2008中实现这一目标的最佳方法是什么?
编辑:名称列中的值将始终相同。
答案 0 :(得分:4)
根据数据库索引,并假设您希望每个唯一名称返回一行,我会看一下
的性能select
name,
min([description]) as description
from
tableA
group by
name
与其他解决方案相比
答案 1 :(得分:3)
SELECT TOP 1 CASE Description WHEN 'FAIL' THEN 'FAIL' ELSE 'PASS' END
FROM DaTable
ORDER BY Description
OP:表可能是空的吗?在这种情况下,显然这个查询不会返回任何行。
修改强>
根据aquinas的评论,我创建了一个没有排序的修改过的查询:
SELECT CASE COUNT(Description) WHEN 0 THEN 'FAIL' ELSE 'PASS' END
FROM DaTable
WHERE Description = 'FAIL'
如果DaTable为空,此查询将返回PASS。
答案 2 :(得分:2)
这是您会找到的最简单的解决方案:
SELECT MIN(Description) FROM tbl
如果至少有一个FAIL
,则我们的result
列将包含FAIL
,否则,它将包含PASS
。
答案 3 :(得分:0)
您可以使用EXISTS
来获取包含“FAIL”的行。
您也可以尝试以下方式:
SELECT TOP 1 COALESCE(tFail.Description,t.Description)
FROM myTable AS t
LEFT JOIN myTable AS tFail ON tFail.Name = t.Name AND tFail.Description = 'FAIL'
WHERE t.Name = 'x'
答案 4 :(得分:0)
以下是查询:
--DROP TABLE result
CREATE TABLE result(Name varchar(10),Description varchar(20))
--select * from result
INSERT INTO result
VALUES('X','PASS'),('X','PASS'),('X','FAIL')
;WITH CTE(descp,cnt) as (SELECT [description],COUNT(*) as cnt FROM result group by [description])
SELECT CASE WHEN COUNT(*) > 1 then 'FAIL' when COUNT(*)=1 then MAX(descp) else 'PASS' END FROM CTE