Mysql 如何联接两个表,然后使用CASE表达式确定它们的排序方式?SQL

Mysql 如何联接两个表,然后使用CASE表达式确定它们的排序方式?SQL,mysql,sql,join,case,Mysql,Sql,Join,Case,考虑以下模式: CREATE TABLE Students ( student_id int, student_name varchar(255), gender varchar(255), dept_id int ); CREATE TABLE Departments ( dept_id int, dept_name varchar(255), ); 我的目标是建立一个表格,显示每门学科注册的学生人数——按学生人数降序排列 到目前为止,我有一个查询就是这样做的:

考虑以下模式:

CREATE TABLE Students (
  student_id int,
  student_name varchar(255),
  gender varchar(255),
  dept_id int
);

CREATE TABLE Departments (
  dept_id int,
  dept_name varchar(255),
);

我的目标是建立一个表格,显示每门学科注册的学生人数——按学生人数降序排列

到目前为止,我有一个查询就是这样做的:

SELECT
    dept_name, count(*) as 'number_of_students'
FROM
    Students
JOIN
    Departments on students.dept_id=Departments.dept_id
GROUP BY
    dept_name
ORDER BY 
    dept_name
并得到以下结果:


dept_name       number_of_students
---------       ----------   
History         1
English         2
Math            2
Science         3

这就是我想要的。。。。然而,我需要包括一个案例,它将根据两个或更多的系是否有相同数量的学生而改变排序

如果两个或多个系的学生人数相同,则结果表需要按字母顺序排序,因此应如下所示:

dept_name       number_of_students
---------       ----------   
English         2
History         1
Math            2
Science         3

我的SQL知识到此为止。。我有一个大概的想法,我应该如何做到这一点..也许使用案例陈述?但我不知道如何或在何处放置它,以及如何比较“学生人数”列中的两个后续值,然后据此做出决定


非常感谢任何帮助或建议

这有点棘手。您可以使用窗口功能查看有多少部门具有相同的计数,然后根据计数是否大于1进行排序:

SELECT dept_name, number_of_students
FROM (SELECT d.dept_name, COUNT(*) as number_of_students,
             COUNT(*) OVER (PARTITION BY COUNT(*)) as cnt_cnt
      FROM Students s JOIN
           Departments d
           ON s.dept_id = d.dept_id
      GROUP BY d.dept_name
     ) d
ORDER BY (CASE WHEN MAX(cnt_cnt) OVER () > 1 THEN dept_name END),
         number_of_student;

我解决了它

谢谢你的主意。。我正在尝试这一个,并不断得到语法错误关于'('
SELECT
    dept_name, count(*) as 'number_of_students'
FROM
    Student
JOIN
    Departments on student.dept_id=Departments.dept_id
GROUP BY
    dept_name
ORDER BY 
     (CASE WHEN number_of_students = number_of_students THEN dept_name ELSE number_of_students
     END)