我有两个相关的表,数据(no,姓名,城市代码,年龄)和城市(代码,城市)。
台球城
+------+------------+
| code | city |
+------+------------+
| A1 | Jakarta |
| A2 | Bali |
| A3 | Semarang |
| A4 | Surabaya |
| C1 | Dili |
| C2 | Jayapura |
| C3 | Yogyakarta |
| C4 | Bandung |
+------+------------+表数据
+----+--------+----------+------+
| no | name | citycode | age |
+----+--------+----------+------+
| 1 | Ony | A3 | 27 |
| 2 | Abri | A3 | 28 |
| 3 | Denny | C4 | 27 |
| 4 | Febri | C1 | 27 |
| 5 | Galih | C3 | 28 |
| 6 | Yulia | A2 | 26 |
| 7 | Zening | A1 | 25 |
+----+--------+----------+------+我想按城市统计27岁的雇员人数。
我的问题是:
select city.city , count(data.name) as Nmb_of_employees
from city
left join
data on data.citycode = city.code
where data.age = 27
group by city.city;结果
+----------+------------------+
| city | Nmb_of_employees |
+----------+------------------+
| Bandung | 1 |
| Dili | 1 |
| Semarang | 1 |
+----------+------------------+但我想要的结果是这样
+------------+------------------+
| city | Nmb_of_employees |
+------------+------------------+
| Jakarta | 0 |
| Bali | 0 |
| Semarang | 1 |
| Surabaya | 0 |
| Dili | 1 |
| Jayapura | 0 |
| Yogyakarta | 0 |
| Bandung | 1 |
+------------+------------------+对于上面的结果,我应该使用什么查询?
发布于 2013-09-12 07:58:26
您需要删除WHERE子句,该子句导致筛选出仅包含年龄为27的员工的记录。SUM(age = 27)只是一个mysql特定的语句,它基本上概括了表达式的布尔结果。它可以进一步修改为使用CASE,这是一个更友好的关系数据库,SUM(CASE WHEN age = 27 THEN 1 ELSE 0 END)。
SELECT a.City, IFNULL(SUM(age = 27), 0) Nmb_of_employees
FROM city a
LEFT JOIN Data b
ON a.code = b.cityCode
GROUP BY a.City发布于 2013-09-12 08:02:28
我认为您需要在ON子句中检查“年龄”:
SELECT city.city , count(data.name) AS Nmb_of_employees
FROM city
LEFT JOIN data
ON data.citycode = city.code
AND data.age = 27
GROUP BY city.city;否则,您将正确地获得表(带有空格),但随后使用WHERE子句筛选出空白。
发布于 2013-09-12 10:24:19
选择不同的城市,计数(名称)从城市m_t3左加入数据m_t4的年龄=27和m_t3.code = m_t4.citycode组按城市
https://stackoverflow.com/questions/18758612
复制相似问题