Объединить вывод различных запросов в виде одного запроса

Как мне объединить вывод разных запросов.

У меня есть следующие 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

Другие вопросы по тегам