我有一个有几行和几列的表。它看起来像这样:
Name Description
X PASS
X PASS
X FAIL
我希望它只返回一行。如果都是PASS,则返回PASS。如果其中一个或多个失败,则返回 FAIL。
在 SQL Server 2008 中实现这一目标的最佳方法是什么?
编辑:名称列中的值将始终相同。
我有一个有几行和几列的表。它看起来像这样:
Name Description
X PASS
X PASS
X FAIL
我希望它只返回一行。如果都是PASS,则返回PASS。如果其中一个或多个失败,则返回 FAIL。
在 SQL Server 2008 中实现这一目标的最佳方法是什么?
编辑:名称列中的值将始终相同。
根据数据库索引,假设您希望每个唯一名称返回一行,我会看看性能
select
name,
min([description]) as description
from
tableA
group by
name
与其他解决方案相比
SELECT TOP 1 CASE Description WHEN 'FAIL' THEN 'FAIL' ELSE 'PASS' END
FROM DaTable
ORDER BY Description
OP:桌子可能是空的吗?在那种情况下,这个查询显然不会返回任何行。
编辑
根据阿奎那的评论,我创建了一个修改后的查询,没有排序:
SELECT CASE COUNT(Description) WHEN 0 THEN 'FAIL' ELSE 'PASS' END
FROM DaTable
WHERE Description = 'FAIL'
如果 DaTable 为空,此查询将返回 PASS。
这是您会发现的最简单的解决方案:
SELECT MIN(Description) FROM tbl
如果至少有一个FAIL
,那么我们的result
列将包含FAIL
,否则,它将包含PASS
。
您可以使用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'
这是查询:
--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