Объединить вывод различных запросов в виде одного запроса
Как мне объединить вывод разных запросов.
У меня есть следующие 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, и это хорошо использовать?
2 ответа
Решение
Если вам нужно получить в качестве отдельных столбцов в выходных данных студентов, учителей и курсы, вы можете попробовать что-то вроде этого:
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
Вы можете использовать внутреннее соединение для получения всех результатов в одной строке
select t0.departmentid
, t0.name
, t1.noOfStudents
, t2.noOfTeachers
, t3.noOfCourses
from department t0
left join
(
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
) t1 ON t0.departmentid = t1.departmentid
left join (
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
) t2 on t0.departmentid = t2.departmentid
left join (
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
) t3 on t0.departmentid = t3.departmentid
или если вам нужен результат на отдельных строках, вы можете использовать UNION ALL