我在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
学生表包含以下字段:
Student_ID
Student_Name
Gender
Dept_ID
Departments表有以下字段:
Dept_ID
Dept_Name
大学使用2个数据表(学生和部门)来存储数据 关于其学生和与各专业相关的部门。
编写查询以打印相应的部门名称和学生人数 在Departments表中所有部门的每个部门主修 (即使没有现在的学生)。
按降低学生人数对结果进行排序;如果两个或多个部门的学生人数相同,则按部门名称的字母顺序对这些部门进行排序。
答案 0 :(得分:1)
您需要一种方法来统计每个部门的学生,然后您需要一种方法来列出所有部门,甚至是那些没有学生的部门。
计算每个部门的学生:(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
内容。
答案 1 :(得分:1)
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;
!!这终于是正确答案了!!
不要硬编码问题,请继续关注并像专业人士一样工作
答案 2 :(得分:0)
在下方执行。
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
答案 3 :(得分:0)
1 选择department_name,count(student_id) 作为student_count 2 来自学生 3 左外连接部门 ON 4 Department.department_id=student.department_id 5 按部门名称分组 6 按部门名称排序; #jaat