如何有条理地总结SQL表的返回值

时间:2012-07-10 18:17:43

标签: sql sql-server

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

Name    Description
X         PASS
X         PASS
X         FAIL

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

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

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

5 个答案:

答案 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