[英]Use listagg to group all students for teacher, course, semster
I have a relationship where a teacher -> courses -> enrollmenr-> students.我有一个教师->课程-> enrollmenr->学生的关系。 I am trying to use listagg to get all the students first/last names on the same line as the teacher_id and course_id.
我正在尝试使用 listagg 将所有学生的名字/姓氏与 teacher_id 和 course_id 放在同一行。 In addition, I want to add the count of each teacher_id, course_id, semester.
此外,我想添加每个 teacher_id、course_id、semester 的计数。
Below is my test CASE, which has the tables, data and a part of the query.下面是我的测试用例,其中包含表、数据和部分查询。 I would appreciate any help completing the query.
如果能帮助完成查询,我将不胜感激。 Thanks in advance to all who answer.
提前感谢所有回答的人。
CREATE TABLE teachers(teacher_id, first_name, last_name) AS
SELECT 101, 'Keith', 'Stein' FROM dual UNION ALL
SELECT 102, 'Roger', 'Wood' FROM dual UNION ALL
SELECT 103, 'Douglas', 'Kern' FROM dual UNION ALL
SELECT 104, 'Paul', 'Weber' FROM dual UNION ALL
SELECT 105, 'Jeffrey', 'Lebowitz' FROM dual UNION ALL
SELECT 106, 'Carol', 'Seltzer' FROM dual;
CREATE TABLE students(student_id, first_name, last_name) AS
SELECT 1, 'Faith', 'Aaron' FROM dual UNION ALL
SELECT 2, 'Lisa', 'Saladino' FROM dual UNION ALL
SELECT 3, 'Leslee', 'Altman' FROM dual UNION ALL
SELECT 4, 'Patty', 'Kern' FROM dual UNION ALL
SELECT 5, 'Beth', 'Cooper' FROM dual UNION ALL
SELECT 99, 'Jill', 'Coralnick' FROM dual;
CREATE TABLE courses(course_id, course_name, teacher_id, semester) AS
SELECT 1, 'Geometry', 101, '2022-2' FROM DUAL UNION ALL
SELECT 2, 'Trigonometry', 102, '2022-2' FROM DUAL UNION ALL
SELECT 3, 'Calculus', 103, '2022-2' FROM DUAL UNION ALL
SELECT 4, 'Chemistry', 104, '2022-2' FROM DUAL UNION ALL
SELECT 5, 'Biology', 105, '2022-2' FROM DUAL UNION ALL
SELECT 6, 'Physcology', 106, '2022-2' FROM DUAL;
CREATE TABLE enrollment(student_id,course_id) AS
SELECT 1, 1 FROM dual UNION ALL
SELECT 2, 1 FROM dual UNION ALL
SELECT 3, 1 FROM dual UNION ALL
SELECT 4, 1 FROM dual UNION ALL
SELECT 5, 1 FROM dual UNION ALL
SELECT 1, 2 FROM dual UNION ALL
SELECT 2, 2 FROM dual UNION ALL
SELECT 3, 2 FROM dual UNION ALL
SELECT 4, 2 FROM dual UNION ALL
SELECT 5, 2 FROM dual UNION ALL
SELECT 1, 3 FROM dual UNION ALL
SELECT 2, 3 FROM dual UNION ALL
SELECT 3, 3 FROM dual UNION ALL
SELECT 4, 3 FROM dual UNION ALL
SELECT 5, 3 FROM dual UNION ALL
SELECT 99, 3 FROM dual;
/* list all teachers, courses, student count, all students for teacher_id, course_id, semester
*/
SELECT
t.teacher_id
, t.first_name
, t.last_name
, c.course_id
, c.course_name
, c.semester
FROM teachers t
LEFT JOIN courses c
ON t.teacher_id = c.teacher_id
ORDER BY teacher_id;
TEACHER_ID FIRST_NAME LAST_NAME COURSE_ID COURSE_NAME SEMESTER
101 Keith Stein 1 Geometry 2022-2
102 Roger Wood 2 Trigonometry 2022-2
103 Douglas Kern 3 Calculus 2022-2
104 Paul Weber 4 Chemistry 2022-2
105 Jeffrey Lebowitz 5 Biology 2022-2
106 Carol Seltzer 6 Physcology 2022-2
You can use a correlated sub-query:您可以使用相关的子查询:
SELECT t.teacher_id
, t.first_name
, t.last_name
, c.course_id
, c.course_name
, c.semester
, (
SELECT LISTAGG(s.last_name || ', ' || s.first_name, '; ')
WITHIN GROUP (ORDER BY s.last_name, s.first_name)
FROM enrollment e
INNER JOIN students s
ON (e.student_id = s.student_id)
WHERE e.course_id = c.course_id
) AS students
FROM teachers t
LEFT JOIN courses c
ON t.teacher_id = c.teacher_id
ORDER BY
teacher_id;
Which, for the sample data, outputs:其中,对于示例数据,输出:
TEACHER_ID 教师编号
FIRST_NAME 名
LAST_NAME 姓
COURSE_ID 课程编号
COURSE_NAME 课程名
SEMESTER 学期
STUDENTS 学生们
101 101
Keith 基思
Stein 斯坦因
1 1个
Geometry 几何学
2022-2 2022-2
Aaron, Faith; 亚伦,信仰; Altman, Leslee;
奥尔特曼,莱斯利; Cooper, Beth;
库珀,贝丝; Kern, Patty;
克恩,帕蒂; Saladino, Lisa
萨拉迪诺,丽莎
102 102
Roger 罗杰
Wood 木头
2 2个
Trigonometry 三角学
2022-2 2022-2
Aaron, Faith; 亚伦,信仰; Altman, Leslee;
奥尔特曼,莱斯利; Cooper, Beth;
库珀,贝丝; Kern, Patty;
克恩,帕蒂; Saladino, Lisa
萨拉迪诺,丽莎
103 103
Douglas 道格拉斯
Kern 克恩
3 3个
Calculus 结石
2022-2 2022-2
Aaron, Faith; 亚伦,信仰; Altman, Leslee;
奥尔特曼,莱斯利; Cooper, Beth;
库珀,贝丝; Coralnick, Jill;
科尔尼克,吉尔; Kern, Patty;
克恩,帕蒂; Saladino, Lisa
萨拉迪诺,丽莎
104 104
Paul 保罗
Weber 韦伯
4 4个
Chemistry 化学
2022-2 2022-2
null null
105 105
Jeffrey 杰弗里
Lebowitz 勒博维茨
5 5个
Biology 生物学
2022-2 2022-2
null null
106 106
Carol 颂歌
Seltzer 苏打水
6 6个
Physcology 生理学
2022-2 2022-2
null null
Or you can use JOIN
s and aggregate:或者您可以使用
JOIN
和聚合:
SELECT t.teacher_id
, MAX(t.first_name) AS first_name
, MAX(t.last_name) AS last_name
, c.course_id
, MAX(c.course_name) AS course_name
, MAX(c.semester) AS semester
, LISTAGG(
NVL2(s.student_id, s.last_name || ', ' || s.first_name, NULL),
'; '
) WITHIN GROUP (ORDER BY s.last_name, s.first_name) AS students
, COUNT(s.student_id) AS num_students
FROM teachers t
LEFT OUTER JOIN courses c
ON t.teacher_id = c.teacher_id
LEFT OUTER JOIN (
enrollment e
INNER JOIN students s
ON (e.student_id = s.student_id)
)
ON (e.course_id = c.course_id)
GROUP BY
t.teacher_id,
c.course_id
ORDER BY
t.teacher_id,
c.course_id;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.