2013-09-22 89 views
0

這可能是一個超級簡單的東西.... 但是現在我無法想象如何在一個語句中做到這一點。基於WHERE的多個聚合查詢

我知道我可以SELECT count(id)WHERE status = APP,並重復所有計數。但我想在一個查詢中完成它。 我會按城市分組,然後按狀態分組,然後按總和?

表是如下....

City | Status | 
City 1 APP 
City 1 NH 
City 1 APP 
City 1 NEW 
City 2 NEW 
City 2 APP 
City 2 APP 
City 2 NH 

欲返回以下數組。

{[cityname]=>City1,[Total]=>4,[APP]=>1,[NH]=>1,[NEW]=>2}, 
{[cityname]=>City2,[Total]=>4,[APP]=>2,[NH]=>1,[NEW]=>1} 

我現在查詢是...

SELECT COUNT(id) as total, city WHERE status = 'APP' GROUP BY city 
SELECT COUNT(id) as total, city WHERE status = 'NH' GROUP BY city 
SELECT COUNT(id) as total, city WHERE status = 'NEW' GROUP BY city 

我知道這是非常簡單的,但它已經有一段時間了,我忘了究竟是如何將這些組合成一個語句。

+1

我的作品,我使用GROUP BY城市 – KyleK

回答

2

組,你可以使用條件SUM()這樣

SELECT city, 
     COUNT(*) total, 
     SUM(CASE WHEN status = 'APP' THEN 1 ELSE 0 END) app, 
     SUM(CASE WHEN status = 'NH' THEN 1 ELSE 0 END) nh, 
     SUM(CASE WHEN status = 'NEW' THEN 1 ELSE 0 END) new 
    FROM table1 
GROUP BY city 

輸出:

 
| CITY | TOTAL | APP | NH | NEW | 
|--------|-------|-----|----|-----| 
| City 1 |  4 | 2 | 1 | 1 | 
| City 2 |  4 | 2 | 1 | 1 | 

這是SQLFiddle演示

+0

啊,是的......這是我需要的更多......謝謝! – KyleK

2

你可以,如果你想每個城市的一排APPNHNEW被列由城市和狀態以及

SELECT COUNT(id) as total, city, status GROUP BY city, status 
+1

「然後創建對象將需要在應用程序端完成,並且不能在SQL方面輕鬆完成「,這是我認爲你的意思添加到這個答案。 –

+0

是的,我想我誤解了期望輸出的格式。 – VahiD

0

這裏有一個簡便方法,只有在MySQL

SELECT City, 
     COUNT(*) Total, 
     SUM(Status = 'APP') APP, 
     SUM(Status = 'NH') NH, 
     SUM(Status = 'NEW') `NEW` 
FROM TableName 
GROUP BY City