如何在LEFT JOIN中按用户统计不同Type值的出现次数?
解决方案
你的问题根源是缺少按用户分组的GROUP BY子句,导致聚合函数对全表统计,而非按单个用户计算。结合LEFT JOIN和条件聚合可以实现需求,以下是完整的SQL语句(假设第一张表名为assignment,第二张表名为user_info):
SELECT ui.`用户(User)`, ui.`电话(Telephone)`, SUM(CASE WHEN a.`类型(Type)` = 'Elementary' THEN 1 ELSE 0 END) AS `小学总数(Total Elementary)`, SUM(CASE WHEN a.`类型(Type)` = 'Middle' THEN 1 ELSE 0 END) AS `初中总数(Total Middle)`, SUM(CASE WHEN a.`类型(Type)` = 'High' THEN 1 ELSE 0 END) AS `高中总数(Total High)` FROM `user_info` ui LEFT JOIN `assignment` a ON ui.`用户(User)` = a.`负责人(AssignedTo)` GROUP BY ui.`用户(User)`, ui.`电话(Telephone)` ORDER BY ui.`用户(User)`;
关键说明:
LEFT JOIN确保用户表中的所有用户都会被保留,即使没有对应的任务记录SUM(CASE...)是条件聚合的核心:匹配指定类型时返回1,否则返回0,求和后得到该用户对应类型的总数;也可以用COUNT(CASE WHEN a.类型(Type)= 'Elementary' THEN 1 END)替代,因为COUNT不会统计NULL值(不匹配时CASE默认返回NULL)GROUP BY子句必须包含所有非聚合字段(这里是用户名和电话),否则数据库无法按用户拆分统计结果- 执行后会输出你需要的格式,无对应类型的用户会显示0
内容的提问来源于stack exchange,提问作者EyeSeeSharp
相关产品推荐
相关产品推荐

