0

How do I combine the output of different queries.

I have the following sql queries with the output:

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 |
+--------------+--------------+-------------+

Now I want to combine all three into a single table to display the data. How can I do that?

Here I am trying UNION operation and is it good to use?

Anil
  • 1,748
  • 8
  • 32
  • 67

2 Answers2

0

If you need to get Students, Teachers and Courses as separate columns in the output, you can try something like this:

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

This should produce something like this:

+--------------+--------------+--------------+--------------+--------------+  
| 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|  
+--------------+--------------+--------------+--------------+--------------+  

If you need aggregated values, just enclose the entire query into brackets and sum the results

SELECT 
    departmentid, name, 
    SUM(noOfStudents), SUM(noOfTeachers), SUM(noOfCourses)
FROM 
    (Query1 UNION ALL Query2 UNION ALL Query3) AS mySubQuery
GROUP BY 
    departmentid, name
marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
Nikola
  • 51
  • 5
  • Its giving error as subquery table reference needs alias, use AS xxx in: "select departmentid, name, sum(noofcourses),sum(noofteachers),sum(noofstudents) " syntax error, unexpected BY in: "by" – Anil Sep 08 '18 at 05:20
0

You could use a inner join for get all result on same row

  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 

or if you need the resul on separated rows you could use UNION ALL

ScaisEdge
  • 131,976
  • 10
  • 91
  • 107