如果第一列值相同,则Concat为第二列值

时间:2013-03-14 16:25:53

标签: sql oracle string-aggregation

我有一个如下所示的查询并列出了它的输出:

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

我想重新编写查询,以便输出如下:

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

任何人都可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

在11g中使用Listagg()或在10g中使用WM_Concat():

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

答案 1 :(得分:1)

如果您使用的是Oracle 11g +,则可以使用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;

请参阅SQL Fiddle with Demo

答案 2 :(得分:1)

11g中的

Listagg是最好的选择:

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你可以使用wm_concat(但请注意,这没有记录):

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

甚至是模型条款:

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