MySQL分组数据时如何不显示包含NULL值的行?
解决MySQL部门员工薪资统计问题
你的原SQL逻辑存在错误,导致薪资统计列出现NULL值——核心问题是在GROUP BY后直接用IF判断单行salary值关联COUNT(*),这会取组内任意一条员工的薪资,要么返回整个部门的总人数,要么返回NULL,根本没统计到符合薪资条件的员工数量。
正确的查询语句
可以用两种方式实现准确统计:
方式1:使用COUNT()结合CASE WHEN
SELECT department_id, COUNT(*) AS total_employees, COUNT(CASE WHEN salary > 6000 THEN 1 END) AS high_salary_count FROM employees WHERE department_id IS NOT NULL GROUP BY department_id -- 若需过滤掉无薪资>6000员工的部门,添加以下HAVING子句 HAVING high_salary_count > 0;
方式2:使用SUM()结合IF()
SELECT department_id, COUNT(*) AS total_employees, SUM(IF(salary > 6000, 1, 0)) AS high_salary_count FROM employees WHERE department_id IS NOT NULL GROUP BY department_id -- 若需过滤掉无薪资>6000员工的部门,添加以下HAVING子句 HAVING high_salary_count > 0;
逻辑说明
COUNT(CASE WHEN ... THEN 1 END):当薪资>6000时返回1,否则返回NULL,COUNT会自动忽略NULL值,最终统计的是符合条件的员工数量。SUM(IF(salary>6000,1,0)):符合薪资条件记1,不符合记0,求和后得到符合条件的人数,结果为数字,不会出现NULL。- 加上
HAVING high_salary_count > 0可只显示存在高薪员工的部门,满足你“只显示无NULL值结果”的需求(正确统计后该列是0或正整数,不会为NULL,此处过滤的是无高薪员工的部门)。
内容的提问来源于stack exchange,提问作者gosiia
相关产品推荐
相关产品推荐

