简体   繁体   English

使用 listagg 将所有学生分组为教师、课程、学期

[英]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;

db<>fiddle here db<> 在这里摆弄

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM