2016-09-09 7 views
0

私は以下のデータセットに対してOracle PL/SQLプロシージャを作成しています。入力されたIDに基づいて未定義のグループ番号を使用したOracle PL/SQLのループ

Column1---Column 2---Column 3 
ID-1  Group1  Item 11 
ID-1  Group1  Item 12 
ID-1  Group1  Item 13 
ID-1  Group2  Item 21 
ID-1  Group2  Item 22 
ID-2  Group3  Item 31 
ID-2  Group3  Item 32 
ID-2  Group4  Item 41 
ID-2  Group5  Item 51 
ID-2  Group5  Item 52 

、私は、これにより、次に各グループ内のいくつかのアイテムを持っている、いくつかのグループを取得します。

入力:単一列のID-1 出力:

Item 11 - Item 21 
Item 11 - Item 22 
Item 12 - Item 21 
Item 12 - Item 22 
Item 13 - Item 21 
Item 13 - Item 22 

入力:単一列のID-2 出力:

Iは、以下のように連結し、結果セットを必要とします
Item 31 - Item 41 - Item 51 
Item 31 - Item 41 - Item 52 
Item 32 - Item 41 - Item 51 
Item 32 - Item 41 - Item 52 

出力にはすべてc入力IDに属する各グループから1つの項目を抽出する。 IDの下の番号グループは固定ではなく、グループ内の項目数は固定されていないことに注意してください。

+0

あなたはコードを書いていると述べました - あなたはすでに何を持っているか見てみましょう。 – massko

答えて

1

使用dense_rank()あなたのグループを数えた後、階層問合せでconnect by句で通信するために、この列を使用する:

select ltrim(sys_connect_by_path(column3, ' - '), ' - ') as list 
    from (select dense_rank() over (order by column2) rnk, column1, column2, column3 
      from yourtable where column1 = 'ID-1') 
    where connect_by_isleaf = 1 
    connect by prior rnk + 1 = rnk 
    start with rnk = 1 

テストデータと出力:

create table yourtable (Column1 varchar2(10), Column2 varchar2(10), Column3 varchar2(10)); 
insert into yourtable values('ID-1', 'Group1', 'Item 11'); 
insert into yourtable values('ID-1', 'Group1', 'Item 12'); 
insert into yourtable values('ID-1', 'Group1', 'Item 13'); 
insert into yourtable values('ID-1', 'Group2', 'Item 21'); 
insert into yourtable values('ID-1', 'Group2', 'Item 22'); 
insert into yourtable values('ID-2', 'Group3', 'Item 31'); 
insert into yourtable values('ID-2', 'Group3', 'Item 32'); 
insert into yourtable values('ID-2', 'Group4', 'Item 41'); 
insert into yourtable values('ID-2', 'Group5', 'Item 51'); 
insert into yourtable values('ID-2', 'Group5', 'Item 52'); 

LIST 
-------------------- 
Item 11 - Item 21 
Item 11 - Item 22 
Item 12 - Item 21 
Item 12 - Item 22 
Item 13 - Item 21 
Item 13 - Item 22  
+0

これはほぼ完璧に機能しましたが、ORA-01489を実行していることがよくあります。文字列連結の結果が長すぎます。 XMLAGGやsimilarを使用することは可能ですか?ご協力いただきありがとうございます!! –

+0

そうだと思います。しかし、これは新しい話題です。新しい質問をするべきかもしれないことをお勧めします。他のユーザーは、このアイデアや他のアイデアについてもっと知っているかもしれません。私はできることをやった;-) –

0
select substr(B.perm,4,length(B.perm)) from 
(select level l,sys_connect_by_path(A.Column3, ' - ') as perm , sys_connect_by_path(A.Column2, ' - ') ttt 
from (select t.* from yourTable t where t.Column1 = 'ID-2')A -- ID-2 is your input 
connect by level <= 3 -- 3 is your distinct group count for your input 
order by level)B 
where B.l = 3 and instr(B.ttt , 'Group3 - Group4 - Group5') > 0 -- 3 is your distinct group count for your input , *** Group3 - Group4 - Group5 is your merged data according to your input 
order by substr(B.perm,4,length(B.perm))asc 

値を正しく設定すると、両方のIDで動作します。

関連する問題