如何组合不同查询的输出。
我有以下 sql 查询及其输出:
1) select d.departmentid, d.name, count(distinct(sg.personid)) as noOfStudents from department d inner join course c on c.departmentid = d.departmentid inner join student_grade sg on sg.courseid = c.courseid group by d.departmentid, d.name;
+--------------+--------------+--------------+
| departmentid | name | noofstudents |
+==============+==============+==============+
| 101 | Computer Sci | 1 |
| 104 | Mech | 2 |
| 103 | EEE | 1 |
+--------------+--------------+--------------+
2) select d.departmentid, d.name, count(distinct(ci.personid)) as noOfTeachers from department d inner join course c on c.departmentid = d.departmentid inner join course_instructor ci on ci.courseid = c.courseid group by d.departmentid, d.name;
+--------------+--------------+--------------+
| departmentid | name | noofteachers |
+==============+==============+==============+
| 101 | Computer Sci | 1 |
| 103 | EEE | 2 |
| 104 | Mech | 1 |
| 102 | ECE | 3 |
+--------------+--------------+--------------+
3) select d.departmentid, d.name, count(distinct(c.courseid)) as noOfCourses from department d inner join course c on c.departmentid = d.departmentid group by d.departmentid, d.name;
+--------------+--------------+-------------+
| departmentid | name | noofcourses |
+==============+==============+=============+
| 101 | Computer Sci | 3 |
| 102 | ECE | 3 |
| 104 | Mech | 1 |
| 103 | EEE | 2 |
+--------------+--------------+-------------+
现在我想将所有三个合并到一个表中来显示数据。 我怎样才能做到这一点?
这里我尝试UNION操作,好用吗?
最佳答案
如果您需要将学生、教师和类(class)作为输出中的单独列,您可以尝试如下操作:
select
d.departmentid, d.name,
count(distinct(sg.personid)) as noOfStudents,
0 as noofteachers, 0 as noofcourses
from
department d
inner join
course c on c.departmentid = d.departmentid
inner join
student_grade sg on sg.courseid = c.courseid
group by
d.departmentid, d.name
UNION ALL
select
d.departmentid, d.name, 0 as noOfStudents,
count(distinct(ci.personid)) as noOfTeachers, 0 as noofcourses
from
department d
inner join
course c on c.departmentid = d.departmentid
inner join
course_instructor ci on ci.courseid = c.courseid
group by
d.departmentid, d.name
UNION ALL
select
d.departmentid, d.name, 0 as noOfStudents,
0 as noofteachers, count(distinct(c.courseid)) as noOfCourses
from
department d
inner join
course c on c.departmentid = d.departmentid
group by
d.departmentid, d.name
这应该会产生这样的结果:
+--------------+--------------+--------------+--------------+--------------+
| departmentid | name | noofstudents | noofteachers | noofcourses |
+==============+==============+==============+==============+==============+
| 101 | Computer Sci | 1| 0| 0|
| 104 | Mech | 2| 0| 0|
| 103 | EEE | 1| 0| 0|
| 101 | Computer Sci | 0| 1| 0|
| 103 | EEE | 0| 2| 0|
| 104 | Mech | 0| 1| 0|
| 102 | ECE | 0| 3| 0|
| 101 | Computer Sci | 0| 0| 3|
| 102 | ECE | 0| 0| 3|
| 104 | Mech | 0| 0| 1|
| 103 | EEE | 0| 0| 2|
+--------------+--------------+--------------+--------------+--------------+
如果您需要聚合值,只需将整个查询括在括号中并对结果求和即可
SELECT
departmentid, name,
SUM(noOfStudents), SUM(noOfTeachers), SUM(noOfCourses)
FROM
(Query1 UNION ALL Query2 UNION ALL Query3) AS mySubQuery
GROUP BY
departmentid, name
关于mysql - 将不同查询的输出合并为单个查询输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52232106/