2017-03-03 12 views
0

Oracle SQLでは複数の行を結合する必要がありますが、LISTAGGまたはwm_concat(EVALUATE_AGGRは無効)にはアクセスできません。私はこれを10回行う場合、私はについてのすべて私が必要とする最初の10行を集約することができますOracle SQLで複数の行を結合する方法(複数の制限がある場合)

max(case when rank("table"."column" BY "table"."column2") = 1 then "table"."column" 
||max(case when rank("table"."column" BY "table"."column2") = 2 then "table"."column" 

私は現在、これを行う恐ろしいハックを使用しています。

これを行うより良い方法はありますか?おそらくサブクエリを使用していますか?

注:Oracle OBIEE 11.1.1.9で動作させるには、これが必要です。

ヘルプやヒントには感謝しています。

+1

[さまざまな技術がここに表示されています](https://oracle-base.com/articles/misc/string-aggregation-techniques)。 'sys_connect_by_path'は、あなたが既にそれらをランキングしているので、開始する場所かもしれません。 –

+0

ありがとうございます。私はこれを見ましたが、LISTAGG、wm_concatとCOLLECTは有効になっておらず、私自身の関数を書くためのアクセス権がありません。 OK:多分私はsys_connect_by_pathを働かせることができます – delica

+0

@delicaこれはOBIEEのダイレクトデータベースリクエストに入りますか?それともRPDに入れようとしているのですか? –

答えて

3

これを回答として書くのは嫌いですが、Oracleベース(Alex Pooleのコメントを参照)とウィリアム・ロバートソンのWebサイト(Oracle-Baseの記事を参照)の両方でsys_connect_by_pathソリューションが完全ではないことが判明しました。コメントには収まりません。

オラクル・ベースのリンク:https://oracle-base.com/articles/misc/string-aggregation-techniques#row_number ウィリアム・ロバートソンのウェブサイトは:http://www.williamrobertson.net/documents/one-row.html

オラクル・ベースのソリューションは、一つだけが必要とされているrow_number()には、2つの呼び出しを使用し、それが代わりにconnect_by_isleafの集計クエリを使用しています。ウィリアムが最初に投稿した解決策かもしれませんが、集計の代わりにrow_number()コールとconnect_by_isleafという1つだけを使用することで、彼のページは現在のところ優れたソリューションを提供しています。

しかし、ウィリアムのページでは、彼はltrim()を使用して、どの文字をトリミングするかを示す引数がないので、実際には効果がありません。そして、row_number()の値から1を減算します。その結果、カンマで区切られた各リストの最初のトークンは除外されます。

これは修正された解決策です。私はこれに独創性がないと主張する。この図は標準SCOTTスキーマのEMPテーブルで実行されています。

select deptno 
    , ltrim(sys_connect_by_path(ename,','), ',') as name_list 
from (select deptno 
       , ename 
       , row_number() over (partition by deptno order by ename) as seq 
     from emp) 
where connect_by_isleaf = 1 
connect by seq = prior seq + 1 and deptno = prior deptno 
start with seq = 1; 

DEPTNO NAME_LIST 
------ ------------------------------------ 
10  CLARK,KING,MILLER 
20  ADAMS,FORD,JONES,SCOTT,SMITH 
30  ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD 
+0

良い点。今私はチェックして、私は2004年にそれを書きました、そして、私は 'ltrim'または' -1'が何のためにあるのか分かりません。 –

+0

@WilliamRobertson - それを修正するのはあまりにも遅くない!ご覧のとおり、人々はまだそれに戻ります(正当な理由で、LISTAGGのような最近のツールを使用できない場合は正解です)。 – mathguy

+0

心配しないで、私はあなたのバージョンをコピーしています:) –

関連する問題