将不同查询的输出组合为单个查询输出
Combine the output of different queries as a single query output
如何组合不同查询的输出。
我有以下 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 |
+--------------+--------------+-------------+
现在我想将所有三个组合成一个 table 来显示数据。
我怎样才能做到这一点?
这里我在尝试UNION操作,好用吗?
如果您需要将学生、教师和课程作为单独的列输出,你可以尝试这样的事情:
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
如何组合不同查询的输出。
我有以下 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 |
+--------------+--------------+-------------+
现在我想将所有三个组合成一个 table 来显示数据。 我怎样才能做到这一点?
这里我在尝试UNION操作,好用吗?
如果您需要将学生、教师和课程作为单独的列输出,你可以尝试这样的事情:
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