【问题标题】:Department name and number of students部门名称和学生人数
【发布时间】:2017-03-13 21:27:26
【问题描述】:

我在我正在尝试的 MySQL 中发现了一个问题。请告诉我以下解决方案是否有效或有更好的解决方案?

select   D.DEPT_NAME, COUNT(*) 
from     Departments D 
left outer join STUDENTS S 
on       S.Dept_ID = D.Dept_ID
group by D.DEPT_NAME
order by 2 desc, 1

Students 表有以下字段:

Student_ID
Student_Name
Gender
Dept_ID

部门表有以下字段:

Dept_ID
Dept_Name

一所大学使用 2 个数据表 Student 和 Departments 来存储数据 关于其学生和与每个专业相关的部门。

  • 编写查询以打印相应的部门名称和学生人数 Departments 表中所有部门的每个部门的专业 (即使是目前没有学生的)。

  • 按学生人数降序排列结果;如果两个或多个部门的学生人数相同,则按部门名称的字母顺序对这些部门进行排序。

【问题讨论】:

  • 一个可能的问题是COUNT(*)。如果部门没有学生,它会返回什么?我猜应该是 1,因为那个部门有一条线。
  • 我是对的,请参阅 sqlfiddle.com/#!15/39a8b/1/0 - 2 个部门(数学和物理)没有学生,您的查询显示他们的计数为 1。
  • @marek.jancuska 你能告诉我哪些 SQL 查询有效吗?
  • 算其他东西
  • 嗯,这很可能是一个家庭作业,当你试图弄清楚时你会学到更多,作为一个提示,我建议postgresql.org/docs/9.5/static/…

标签: mysql database


【解决方案1】:

请原谅我更改了代码的格式。

我会更改 ORDER BY,如下所示:

SELECT
    d.DEPT_NAME,
    COUNT(s.STUDENT_ID)
FROM
    Departments d 
    LEFT JOIN Students s ON d.DEPT_ID = s.DEPT_ID
GROUP by
    d.DEPT_ID
ORDER by
    COUNT(s.STUDENT_ID) DESC, 
    d.DEPT_NAME ASC

【讨论】:

    【解决方案2】:
    SELECT d.department_name, COUNT(s.student_name) AS student_count
    FROM student s
    LEFT JOIN department d
    ON s.department_id = d.department_id
    GROUP BY department_name
    ORDER BY d.department_name;
    

    !!这终于是正确答案了!!

    不要对问题进行硬编码,请继续关注并像专业人士一样工作

    【讨论】:

      【解决方案3】:

      您需要一种方法来计算每个部门的学生人数,然后您需要一种方法来列出所有部门,即使是没有学生的部门。

      统计各系学生人数:(http://sqlfiddle.com/#!15/39a8b/15/0)

                SELECT Dept_ID, COUNT(*) Students
                  FROM STUDENTS 
                 GROUP BY Dept_ID
      

      然后,将其视为子查询,将其连接到您的另一个表。 (http://sqlfiddle.com/#!15/39a8b/16/0)

       SELECT D.DEPT_NAME, S.Students
         FROM Departments D
         LEFT JOIN (
                SELECT Dept_ID, COUNT(*) Students
                  FROM STUDENTS 
                 GROUP BY Dept_ID
              ) S ON D.Dept_ID = S.Dept_ID
      

      LEFT JOIN 保留 DEPARTMENTS 表中与 ON 子句不匹配的行。这会让你得到这样的东西。

        Biology           7
        Mathematics  (NULL)
        Sociology        11
        Physics           3
      

      所以你必须处理那个(NULL)问题。就是这样。将 SELECT 更改为说

       SELECT D.DEPT_NAME, IFNULL(S.Students,0)
      

      将表连接到聚合(COUNT/GROUP BY 查询)缺少数据的聚合有点棘手。但这就是你的做法。

      你可以自己弄清楚ORDER BY的东西。

      【讨论】:

        【解决方案4】:

        在下面执行。

        SELECT   
            ad.Dept_Name, 
            count(ass.Student_Id) as Stduent_Enrolled
        
            FROM [Alok.Departments] ad
        
            Left Outer Join [Alok.Students] ass
                ON ad.Dept_ID = ass.Dept_ID
        
            Group by ad.Dept_Name
        
            ORDER by
               CASE WHEN COUNT(ad.Dept_ID) >=2 
                   THEN ad.DEPT_NAME END desc,
               CASE WHEN COUNT(ad.Dept_ID) < 2 
                   THEN ad.DEPT_NAME END asc
        

        【讨论】:

          【解决方案5】:

          1 select department_name, count(student_id) as student_count 2 学生 3 左外连接部门 ON 4 部门.department_id=学生.department_id 5 按部门名称分组 6 按部门名称排序; #jaat

          【讨论】:

          • 欢迎来到 Stack Overflow!虽然这段代码可以解决问题,including an explanation 解决问题的方式和原因确实有助于提高帖子的质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-29
          • 2021-06-20
          • 2022-01-22
          相关资源
          最近更新 更多