If I have a data like this:
GROUP | SEQUENCE | COMMAND
------------------------------
ONE | 3 | MESSAGE
ONE
Never use WM_CONCAT
. Read Why not use WM_CONCAT function in Oracle?
See this topic https://stackoverflow.com/a/28758117/3989608.
It is undocumented, and any application which relies on WM_CONCAT
will not work once upgraded to 12c
because it has been removed from the latest 12c version.
There are many ways of doing string-aggregation, depending on the database version. See few examples below:
11gR2
Use LIASTAGG
:
SQL> SELECT grp,
2 listagg(command, ',') WITHIN GROUP(
3 ORDER BY seq) command
4 FROM t
5 GROUP BY grp;
GRP COMMAND
--- --------------------------------------------------------------------------------------------
ONE ,MESSAGE ,MESSAGE
TWO ,MESSAGE ,MESSAGE
SQL>
9i and up
Use ROW_NUMBER()
and SYS_CONNECT_BY_PATH
:
SQL> SELECT grp,
2 LTRIM(MAX(SYS_CONNECT_BY_PATH(command,','))
3 KEEP (DENSE_RANK LAST ORDER BY seq),',') command
4 FROM (SELECT grp,
5 command,
6 seq,
7 ROW_NUMBER() OVER (PARTITION BY grp ORDER BY seq) AS curr,
8 ROW_NUMBER() OVER (PARTITION BY grp ORDER BY seq) -1 AS prev
9 FROM t)
10 GROUP BY grp
11 CONNECT BY prev = PRIOR curr AND grp = PRIOR grp
12 START WITH curr = 1;
GRP COMMAND
--- --------------------------------------------------------------------------------------------
ONE ,MESSAGE ,MESSAGE
TWO ,MESSAGE ,MESSAGE
SQL>