Concat the second column value if the first column value is same

后端 未结 3 1514
梦如初夏
梦如初夏 2020-12-12 07:40

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;
<         


        
相关标签:
3条回答
  • 2020-12-12 08:20

    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....
    
    0 讨论(0)
  • 2020-12-12 08:35

    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
    
    0 讨论(0)
  • 2020-12-12 08:39

    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

    0 讨论(0)
提交回复
热议问题