2013-04-22 93 views
4

我试图根据多个条件来计算不同的值。 示例数据练习如下。SQL:根据其他列中的多个条件从一列中计算不同的值

 
      Table1 
╔════════╦════════╦══════╗ 
║ Bug ID ║ Status ║ Test ║ 
╠════════╬════════╬══════╣ 
║  1 ║ Open ║ w ║ 
║  2 ║ Closed ║ w ║ 
║  3 ║ Open ║ w ║ 
║  4 ║ Open ║ x ║ 
║  4 ║ Open ║ x ║ 
║  5 ║ Closed ║ x ║ 
║  5 ║ Closed ║ x ║ 
║  5 ║ Closed ║ y ║ 
║  6 ║ Open ║ z ║ 
║  6 ║ Open ║ z ║ 
║  6 ║ Open ║ z ║ 
║  7 ║ Closed ║ z ║ 
║  8 ║ Closed ║ z ║ 
╚════════╩════════╩══════╝ 
     Desired Query Results 
╔══════╦═══════════╦════════════╗ 
║ Test ║ Open Bugs ║ Total Bugs ║ 
╠══════╬═══════════╬════════════╣ 
║ w ║   2 ║   3 ║ 
║ x ║   1 ║   2 ║ 
║ y ║   0 ║   1 ║ 
║ z ║   1 ║   3 ║ 
╚══════╩═══════════╩════════════╝ 

给定的Bug可以在多次测试中找到,多次用于相同的测试(例如:6)或两者(例如:5)。

下面的查询工作正常,准确地提供“全方位错误”

SELECT 
Test, 
COUNT(DISTINCT Bug ID) AS "Total Bugs" 
FROM 
Table1 
GROUP BY Test 

我的研究使我对下面的查询变化。他们错过了不同的错误,因此为“打开错误”列返回不正确的结果(查询如下所示)

SELECT 
Test, 
SUM(CASE WHEN Status <> 'Closed' THEN 1 ELSE 0 END) AS "Open Bugs" 
FROM 
Table1 
GROUP BY Test 
 
╔══════╦═══════════╗ 
║ Test ║ Open Bugs ║ 
╠══════╬═══════════╣ 
║ w ║   2 ║ 
║ x ║   2 ║ 
║ y ║   0 ║ 
║ z ║   3 ║ 
╚══════╩═══════════╝ 

当然我的最终结果必须在一个表中提供两个计数列(而不是像我为演示目的而使用单独的查询)。

我不想依赖多个子查询,因为我的现场示例将具有两个以上的列,并且来自同一个表的计数但具有各种条件。

我正在使用SQL Server(不知道发布)。

任何帮助,非常感谢。

回答

15

您可以通过使用此代码有一个条件count(distinct)

SELECT Test, COUNT(DISTINCT "Bug ID") AS "Total Bugs", 
count(distinct (CASE WHEN "Status" <> 'Closed' THEN "Bug ID" END)) as "Open Bugs" 
FROM Table1 
GROUP BY Test 

case语句检查的条件。如果为true,则返回Bug ID。当不存在时,它默认为NULL,因此该ID不会被计数。

+1

非常有帮助。我不知道你可以在'THEN'之后引用列。谢谢! – Blake 2013-04-22 21:23:15

相关问题