-1

以下のようなクエリがあり、その出力をリストします。

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

誰でも助けることができますか?

4

3 に答える 3

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
于 2013-03-14T16:38:36.867 に答える
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....
于 2013-03-14T16:30:21.093 に答える
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 を参照してください

于 2013-03-14T16:30:24.273 に答える