如何同时使用Count与Sum?实现员工证书数量统计并筛选
解决SQL分组统计的问题
我来帮你搞定这个统计需求!你现在的查询返回多条重复记录,核心问题出在GROUP BY的分组条件上。
原语句的问题
你在GROUP BY里同时指定了employee_bt.EMP_NUM和earnedrating_bt.RTG_CODE,这会让数据库按「单个员工+单个证书」的组合来分组,每个分组里只有一条证书记录,所以COUNT的结果自然都是1,没法汇总出每个员工的总证书数。另外,你还多关联了rating_bt表——如果只是统计证书数量,这个表完全不需要,反而会增加查询开销。
修正后的SQL语句
SELECT CONCAT(employee_bt.EMP_FNAME, " ", employee_bt.EMP_LNAME) AS "Full Name", COUNT(earnedrating_bt.RTG_CODE) AS "Count of Rating" FROM employee_bt INNER JOIN earnedrating_bt ON earnedrating_bt.EMP_NUM = employee_bt.EMP_NUM GROUP BY employee_bt.EMP_NUM, employee_bt.EMP_FNAME, employee_bt.EMP_LNAME HAVING COUNT(earnedrating_bt.RTG_CODE) > 3 ORDER BY employee_bt.EMP_LNAME ASC;
关键调整说明
- 简化分组条件:只按员工的唯一标识
EMP_NUM以及姓名字段分组(有些数据库要求SELECT里的非聚合字段都要出现在GROUP BY里,所以加上姓名更稳妥),这样同一个员工的所有证书记录会被合并成一组,COUNT就能正确统计总数量。 - 添加HAVING筛选:用
HAVING COUNT(...) > 3来筛选出证书数量超过3的员工——注意不能用WHERE,因为WHERE是在分组前筛选记录,而HAVING是分组后筛选结果。 - 移除不必要的关联:删掉了和
rating_bt的JOIN,因为你不需要用到这个表的任何字段,简化查询逻辑。
执行这个语句后,就能得到你想要的结果:每个员工一行,显示全名和总证书数,且只保留证书数超过3的记录,比如Rhonda Lewis会显示4,John Lange显示3。
内容的提问来源于stack exchange,提问作者TigerInnerDragon
相关产品推荐
相关产品推荐

