2013-09-22 90 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