2

我有一个有几行和几列的表。它看起来像这样:

Name    Description
X         PASS
X         PASS
X         FAIL

我希望它只返回一行。如果都是PASS,则返回PASS。如果其中一个或多个失败,则返回 FAIL。

在 SQL Server 2008 中实现这一目标的最佳方法是什么?

编辑:名称列中的值将始终相同。

4

5 回答 5

4

根据数据库索引,假设您希望每个唯一名称返回一行,我会看看性能

select 
  name, 
  min([description]) as description
from 
    tableA
group by
name

与其他解决方案相比

于 2012-07-10T18:29:30.203 回答
3
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。

于 2012-07-10T18:26:28.903 回答
2

这是您会发现的最简单的解决方案:

SELECT MIN(Description) FROM tbl

如果至少有一个FAIL,那么我们的result列将包含FAIL,否则,它将包含PASS

于 2012-07-10T18:30:25.940 回答
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'
于 2012-07-10T18:19:40.687 回答
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
于 2012-07-11T08:57:34.417 回答