繁体   English   中英

SQL 服务器计数和分组具体问题

[英]SQL Server Count and Group-By Specific Question

有一个带有列的表coursesstudentclass

我们需要列出所有超过或等于 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

现在我有两个问题:

  1. 为什么我们需要计算学生而不是 class? 我想我的逻辑也是正确的:计算每个class的频率,得到这个class被选中的次数,等于这个class有多少人。
  2. 为什么区分是必要的? 学生 A 怎么能考两次数学 class?

要回答您的问题 - 以相反的顺序:

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

SQLFiddle 上的演示

假设给定的学生只能与给定的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM