我有两个相关的表格,数据(不,姓名,城市代码,年龄)和城市(代码,城市)
表城市
+------+------------+
| 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 |
+------------+------------------+
我应该使用什么查询来获得上述结果?
答案 0 :(得分:2)
您需要删除WHERE
子句,该子句会导致仅过滤员工年龄为27
的记录。 SUM(age = 27)
只是一个特定于mysql的语句,它基本上总结了表达式的布尔结果。它可以进一步修改为使用CASE
,这是一个更友好的RDBMS,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
答案 1 :(得分:1)
我想你想在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
子句过滤了空白。
答案 2 :(得分:0)
SELECT DISTINCT city,count(name)FROM city m_t3 LEFT JOIN data m_t4 ON 年龄= 27岁 AND m_t3.code = m_t4.citycode GROUP BY city