2013-04-22 61 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

相關問題