[英]SQL Server Count and Group-By Specific Question
有一个带有列的表courses
: student
和class
我们需要列出所有超过或等于 5 个学生的班级。
例如,表:
+---------+------------+
| student | class |
+---------+------------+
| A | Math |
| B | English |
| C | Math |
| D | Biology |
| E | Math |
| F | Computer |
| G | Math |
| H | Math |
| I | Math |
+---------+------------+
我的答案:
select class from
(
select class, count(distinct class) as number
from courses
group by class
) as classandnumber
where number > 5 or number = 5
而正确的答案是:
SELECT
class
FROM
(SELECT
class, COUNT(DISTINCT student) AS num
FROM
courses
GROUP BY class) AS temp_table
WHERE
num >= 5
现在我有两个问题:
要回答您的问题 - 以相反的顺序:
2 - DISTINCT
是必要的,因为学生可能会参加 class 两次,例如,如果他们第一次失败。
1 - 当您按class
,您计算具有相同class
值的字段的所有值。 如果您COUNT(DISTINCT class)
,该数字将为 1(因为只有 1 个 class 具有相同的class
值)。 因此,您需要计算student
值来查找具有特定class
值的student
值的数量。
请注意,子查询不是必需的, COUNT
测试可以位于HAVING
子句中:
SELECT class
FROM courses
GROUP BY class
HAVING COUNT(DISTINCT student) >= 5
假设给定的学生只能与给定的 class 关联一次,则不需要不同的逻辑:
SELECT class
FROM courses
GROUP BY class
HAVING COUNT(*) > 5;
请注意,您也不需要子查询。 如果一个给定的学生可以多次与同一个 class 关联,您将在HAVING
子句中使用不同的计数:
SELECT class
FROM courses
GROUP BY class
HAVING COUNT(DISTINCT student) > 5;
在这个问题中,我们计算了学生,因为问题的要求是找到学生,然后我们按班级对结果进行分组,这将导致找到每个 class 中的学生......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.