Oracle多行转单行

Oracle multple rows to single row

我想在 oracle 中将多行连接成一行。以下是我想要实现的目标

案例table

case_id Name
1       AAA
2       BBB

主题table

case_id Subject
1       ENG
1       MATH
1       SCI
2       ENG
2       HIS

SUB_LOOKUP table

Abbr    Subject
ENG     English
MATH    Mathematics
SCI     Science
HIS     History

预期输出

1   AAA     English, Mathematics, Science
2   BBB     English, History

我尝试使用如下的 LISTAGG 函数。它列出了我想要实现的目标,但是当我加入查找 table 然后加入主 table.

时,问题就来了
SELECT c.case_id, c.category_id, LISTAGG(cs.special_interest_cd) WITHIN GROUP 
(ORDER BY cs.special_interest_cd) AS description
FROM CASE_SPECIAL_INTEREST cs, cases c
where c.case_id = cs.case_id
GROUP BY c.case_id;

尝试加入 2 table,但加入 "ORA-00979: not a GROUP BY expression" 有人可以帮助加入 3 tables 吗?没有 LISTAGG 是否有可能实现相同的效果,因为我读到它在达到 varchar 的最大字符数时抛出异常?

你只需要三个表之间的基本连接,然后是 case_idname 的聚合:

SELECT
    c.case_id,
    c.Name,
    LISTAGG(sl.subject, ',') WITHIN GROUP (ORDER BY sl.subject) AS subject
FROM "case" c
LEFT JOIN subject s
    ON c.case_id = s.case_id
LEFT JOIN sub_lookup sl
    ON s.Subject = sl.Abbr
GROUP BY
    c.case_id,
    c.Name;

Demo

请注意,我在这里使用左连接,以确保如果给定的 case_id 没有聚合的匹配项,结果集中仍会报告 record/value。