2016-09-21 20 views
0

私たちのデータベースは、Ingres II 10.0.0(su9.us5/132)です。そのため、複数の行のデータを1つの列にマージすることを非常に困難にする、stuff、coalesceなどの多くの有用な機能が欠落しています。Ingres SQL複数の行を1つの列に選択

これがありました:How to GROUP_CONCAT in Ingres?ですが、私たちのデータがどのように構造化されているかにはその解決策はありません。

基本的には、参照番号を持つテーブルがあり、複数のステータスを持つ場合は、各行にその参照番号を複数回含めることができます。例えば


123 ABC
123 DEF
123 GHI
189 ABC
189 GHI

私は1つのSELECT文の中に複数のテーブルからデータを引っ張っていて、これはちょうどです後のデータの一部だから私は、彼らが持っているそれぞれのステータスについて、重複する人の3つの行に終わるのではなく、「ABC」、「DEF」、「GHI」を1つの列に選択することを望みます。

私はまだ機能するオプションを見つけることができません。

アイデアをいただければ幸いです。

ありがとうございました。

答えて

0

私はあなたが行生成プロシージャを使用してこれを達成できるはずだと思います。

ここでは、あなたのニーズに合わせて調整できる簡単な例を示します。連結結果が長くなることが予想される場合は、varcharの最大長が32000であることを忘れないでください。

create table myx(a integer not null, b char(3)); 
insert into myx values(123,'ABC'); 
insert into myx values(123,'DEF'); 
insert into myx values(123,'GHI'); 
insert into myx values(189,'ABC'); 
insert into myx values(189,'GHI'); 

create procedure myproc 
result row r(a integer not null, b varchar(1000))= 
declare aval=integer; 
     bval=varchar(1000); 
     newa=integer; 
     newb=char(3); 
begin 
    aval=NULL; 
    bval=''; 
    for select a,b into :newa, :newb from myx order by a,b 
    do 
    if :aval != :newa or :aval is null 
    then 
     if :aval is not null 
     then 
     return row(:aval, :bval); 
     endif; 
     aval = :newa; 
     bval = :newb; 
    else 
     bval=:bval+','+:newb; 
    endif; 
    endfor; 
    if :aval is not null 
    then 
    return row(:aval, :bval); 
    endif; 
end; 

select * from myproc(); 
関連する問題