如何修改SQL语句使统计结果为0的部门也显示(按部门统计is_female为True的教授数量)
这个问题很常见,核心原因是你现在用的是隐式内连接(通过逗号关联表+WHERE条件),这种连接只会返回两个表中完全匹配的记录——而department2没有符合is_female='True'的教授,所以直接被过滤掉了。要让所有部门都显示,哪怕数量为0,你需要改成左外连接,并调整统计逻辑,具体可以这么改:
写法一:左连接时直接过滤符合条件的教授
SELECT d.name, COUNT(CASE WHEN p.is_female = 'True' THEN 1 END) AS female_professor_count FROM department AS d LEFT JOIN professor AS p ON d.id = p.department_id AND p.is_female = 'True' GROUP BY d.id, d.name;
这里用LEFT JOIN确保所有部门都会被保留,哪怕没有匹配的教授。把p.is_female='True'放在ON子句里,而不是WHERE,这样不会过滤掉没有符合条件教授的部门。COUNT(CASE...)会只统计满足条件的记录,没有符合条件的情况就返回0。
写法二:先关联所有教授,再统计符合条件的数量
SELECT d.name, SUM(CASE WHEN p.is_female = 'True' THEN 1 ELSE 0 END) AS female_professor_count FROM department AS d LEFT JOIN professor AS p ON d.id = p.department_id GROUP BY d.id, d.name;
这种写法先把所有部门和对应的教授关联起来,再用CASE表达式判断每个教授是否符合条件,符合就加1,否则加0,最后用SUM汇总数量。对于没有符合条件教授的部门,SUM会返回0,正好符合需求。
另外要注意:原来的GROUP BY p.department_id不太严谨,因为当某个部门没有匹配的教授时,p.department_id会是NULL,改用d.id, d.name分组更可靠,因为部门的id和name是唯一且确定的。
内容的提问来源于stack exchange,提问作者Sanewa
相关产品推荐
相关产品推荐

