Question

I have a query like below and listed output of it:

SELECT DISTINCT TRACKING_NUM,TITLE_OF_DOC_SEC 
FROM some_table  
WHERE  TRACKING_NUM IS NOT NULL;

o/p:

TRACKING_NUM   TITLE_OF_DOC_SEC
007            Email Flow
007            Test Bug 53306
007            Title 1119
007            Title Test
007            test bug
009            1156
089            Title 21173
098            test Doc Section

I want to re write the query so that get an output to be like this:

TRACKING_NUM    TITLE_OF_DOC_SEC
007             Email Flow,Test Bug 53306,Title 1119,Title Test,test bug
009             1156
089             Title 21173
098             test Doc Section

can anyone help?

Was it helpful?

Solution

Use Listagg() in 11g or WM_Concat() in 10g:

   SELECT LISTAGG(TITLE_OF_DOC_SEC, ',') WITHIN GROUP (ORDER BY TRACKING_NUM) AS TITLE_OF_DOC_SEC 
     FROM your table
    WHERE....

   SELECT WM_CONCAT(TITLE_OF_DOC_SEC) AS TITLE_OF_DOC_SEC
     FROM your table
    WHERE....

OTHER TIPS

If you are using Oracle 11g+, then you can use LISTAGG():

SELECT TRACKING_NUM,
  LISTAGG(TITLE_OF_DOC_SEC, ', ') WITHIN GROUP (ORDER BY TRACKING_NUM) AS TITLE_OF_DOC_SEC 
FROM some_table  
WHERE  TRACKING_NUM IS NOT NULL
GROUP BY TRACKING_NUM;

See SQL Fiddle with Demo

in 11g Listagg is the best option:

SQL> select tracking_num,
  2         listagg(title_of_doc_sec,',') within group (order by title_of_doc_sec) title_of_doc_sec
  3    from (select distinct tracking_num , title_of_doc_sec from some_table)
  4   group by tracking_num;

TRA TITLE_OF_DOC_SEC
--- ----------------------------------------------------------------------
007 Email Flow,Test Bug 53306,Title 1119,Title Test,test bug
009 1156
089 Title 21173
098 test Doc Section

10g you can use wm_concat (but be aware this is not documented):

SQL> select tracking_num,
  2         wm_concat(title_of_doc_sec) title_of_doc_sec
  3    from (select distinct tracking_num , title_of_doc_sec from some_table)
  4   group by tracking_num;

TRA TITLE_OF_DOC_SEC
--- ----------------------------------------------------------------------
007 Title Test,test bug,Title 1119,Email Flow,Test Bug 53306
009 1156
089 Title 21173
098 test Doc Section

or even the model clause:

SQL> with data as (select distinct tracking_num , title_of_doc_sec from some_table)
  2  select tracking_num, title_of_doc_sec
  3    from (select *
  4            from data
  5          model
  6          partition by (tracking_num)
  7          dimension by (row_number() over (partition by tracking_num order by title_of_doc_sec) rn)
  8          measures (title_of_doc_sec t, cast(null as varchar2(4000)) title_of_doc_sec,
  9                    count(*) over (partition by tracking_num) cnt)
 10          rules(
 11            title_of_doc_sec[any] = case when t[cv() - 1 ] is null
 12                                        then t[cv()]
 13                                        else title_of_doc_sec[cv()-1]||', '|| t[cv()]
 14                                      end
 15          ))
 16   where cnt = rn;

TRA TITLE_OF_DOC_SEC
--- ----------------------------------------------------------------------
007 Email Flow, Test Bug 53306, Title 1119, Title Test, test bug
009 1156
089 Title 21173
098 test Doc Section
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top