将不同查询的输出合并为一个查询输出

4urapxun  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(260)

如何组合不同查询的输出。
我有以下带有输出的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 |
+--------------+--------------+-------------+

现在我想把这三个合并到一个表中来显示数据。我该怎么做?
我在这里尝试联合行动,它好用吗?

plicqrtu

plicqrtu1#

可以使用内部联接来获取同一行上的所有结果

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

pbwdgjma

pbwdgjma2#

如果需要在输出中将学生、教师和课程作为单独的列,可以尝试以下操作:

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

相关问题