如何在SQL中筛选grade=0与grade=1数量不等的学生
SQL查询:筛选grade记录数不等的学生
需求说明:
- 针对每个
student_name,统计其grade='0'和grade='1'的记录数 - 若两者数量相等,则排除该学生;若数量不等,则选中该学生
示例表结构与数据
CREATE TABLE student ( student_name VARCHAR(50), grade CHAR(1) ) INSERT INTO student SELECT 'Jack', '0' UNION ALL SELECT 'Jack', '0' UNION ALL SELECT 'Jack', '0' UNION ALL SELECT 'Jack', '1' UNION ALL SELECT 'Jack', '1' UNION ALL SELECT 'Jack', '1' UNION ALL SELECT 'Rose', '0' UNION ALL SELECT 'Rose', '0' UNION ALL SELECT 'John', '1' UNION ALL SELECT 'John', '1' UNION ALL SELECT 'John', '1' UNION ALL SELECT 'John', '1' UNION ALL SELECT 'Dave', '1' UNION ALL SELECT 'Dave', '1' UNION ALL SELECT 'Chris', '0'
解法1:使用COUNT+CASE统计
SELECT student_name FROM student GROUP BY student_name HAVING COUNT(CASE WHEN grade = '0' THEN 1 END) != COUNT(CASE WHEN grade = '1' THEN 1 END);
说明:COUNT(CASE...)会忽略NULL值,因此分别统计出grade为0和1的记录数,HAVING子句筛选出两者数量不等的学生。
解法2:使用SUM+CASE统计
SELECT student_name FROM student GROUP BY student_name HAVING SUM(CASE WHEN grade = '0' THEN 1 ELSE 0 END) != SUM(CASE WHEN grade = '1' THEN 1 ELSE 0 END);
说明:SUM通过CASE将符合条件的记录转为1,不符合的转为0,求和后得到对应grade的记录数,再比较是否不等。
简洁写法(适用于支持布尔值转数值的SQL方言,如MySQL)
SELECT student_name FROM student GROUP BY student_name HAVING SUM(grade = '0') != SUM(grade = '1');
说明:grade='0'会返回布尔值,在MySQL中布尔值TRUE转为1,FALSE转为0,直接求和即可得到对应记录数。
以上查询执行后,Jack会被排除,Rose、John、Dave、Chris都会被选中,符合需求。
内容的提问来源于stack exchange,提问作者Bugra Varol
相关产品推荐
相关产品推荐

