You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 02:35:35