2013-03-19 341 views
5

我有一個查詢,看起來像SQL查詢計數結果的數量,不同的條件成立

SELECT ju.name, 
    COUNT(DISTINCT p.value) AS nproblems 
FROM #problems p 
JOIN <thing> ju ON <whatever> 
WHERE <condition 1> 
    AND <condition 2> 
    AND <condition 3> 
GROUP BY ju.name 
ORDER BY nproblems DESC 

這是好的,給我用的名字和值的結果集。但是我真正關心的是沒有WHERE子句的問題的數量,然後僅僅是條件1,然後條件1 + 2,然後條件1 + 2 + 3。我想寫

SELECT ju.name, 
    COUNT(DISTINCT p.value WHERE <condition 1>) foo, 
    COUNT(DISTINCT p.value WHERE <condition 2>) bar, 
... 

但可惜我不能。有沒有這樣做的好方法?

+0

+1有趣的問題:如馬哈茂德建議 - 嘗試在'SELECT'使用'CASE'條款並擺脫'WHERE' – whytheq 2013-03-19 12:13:20

回答

4

可以使用CASE表達這樣做:

SELECT ju.name, 
    SUM(CASE WHEN <condition 1> THEN 1 ELSE 0 END) AS foo, 
    SUM(CASE WHEN <condition 1> THEN 1 ELSE 0 END) AS bar, 
    ... 
FROM #problems p 
JOIN <thing> ju ON <whatever> 
GROUP BY ju.name 
ORDER BY nproblems DESC; 

不過:如果您使用的是支持,如MS SQL Server或Oracle的PIVOT表運營商RDBMS,你可以用它做所以,直接。


由於您使用的是SQL Server,您可以使用PIVOT表運算符可以這樣做:

SELECT * 
FROM 
(
) AS t 
PIVOT 
(
    COUNT(value) 
    FOR name IN(...) 
) AS p; 
+1

太棒了,謝謝。我的確在使用MS SQL服務器 - 不知道我看到了什麼我會旋轉。你能舉個例子嗎? – katrielalex 2013-03-19 11:40:23

+0

@katrielalex - 這取決於,我只是發佈一個簡單的僞代碼來說明如何去做,但還有其他的變化。你可以請求從兩個表中的一些樣本數據與所需的輸出?這將是有益的。 – 2013-03-19 11:47:49

相關問題