在Oracle SQL中使用LISTAGG()时,如何从聚合列表中删除重复值?

时间:2018-06-20 21:15:41

标签: sql oracle listagg

我创建了一个表:

wixlibs

使用Listagg()通过查询获取Fname和Lname的串联聚合:

Grade FName LName-

A     JOHN     M

A     JOE      M

A     JOAKIM   M

我得到的输出是:

SELECT GRADE,listagg(st_name || ';' || st_last_name, ';')
        within group ( order by st_name) as names FROM STUDENTS GROUP BY GRADE;

我想在名称栏中保留唯一的一个“ M”,并希望丢弃其他M。请向我提供有关如何完成此操作的任何建议。请不要仅针对此问题。谢谢!

示例: KEVIN; M; SEEHO; M应该是KEVIN; M; SEEHO,JOAKIM; M; JOE; M; JOHN; M应该是JOAKIM; M; JOE; JOHN等...

1 个答案:

答案 0 :(得分:1)

对于简单查询,可以使用子查询:

SELECT GRADE, listagg(name, ';') within group (order by name) as names
FROM (SELECT DISTINCT GRADE, st_name || ';' || st_last_name as name
      FROM STUDENTS
     ) s
GROUP BY GRADE;

我觉得奇怪的是,您同时使用分号来分隔st_namest_last_name并分隔不同的值。我希望使用不同的分隔符-'john;smith;jane;doe;''john,smith;jane,doe'更难读。