oracle

LISTAGG 複数行の値を1行でまとめて表示する

LISTAGG集計関数

先日SELECTで複数行返却される値をJava側で1行にまとめる実装を見ました。まぁ、SQLの方言に依存する実装を強く勧める気は全くありませんが、SQLでの実装も可能です。以下例題では”/”で区切っていますが、当然カンマ区切りも可能です。

SQL> set lin 200
SQL> col pcname format a20
SQL> col spec_key format a10
SQL> col spec_name format a20
SQL> col sumally format a40
-- 以下のようなデータがあります。

SQL> select * from note_pc order by 1,2;

PCNAME               SPEC_KEY   SPEC_NAME
-------------------- ---------- --------------------
FMV LIFEBOOK         CPU        Core i5 10210U
FMV LIFEBOOK         core       4コア
FMV LIFEBOOK         メモリ     8G
LAVIE N15            CPU        Ryzen 5 4500U
LAVIE N15            core       6コア
LAVIE N15            メモリ     8G
ThinkBook 14         CPU        Core i5 1235U
ThinkBook 14         core       10コア 1235U
ThinkBook 14         メモリ     16G

9行が選択されました。

SQL>
-- これをPC毎にスペックを横1列で表示します。

SQL> select pcname,listagg(spec_name,'/') within group (order by spec_key,spec_name) sumally
  2  from note_pc
  3  group by pcname;

PCNAME               SUMALLY
-------------------- ----------------------------------------
FMV LIFEBOOK         Core i5 10210U/4コア/8G
LAVIE N15            Ryzen 5 4500U/6コア/8G
ThinkBook 14         Core i5 1235U/10コア 1235U/16G

SQL>
以下は今回のテストデータです
create table note_pc
(
 pcname varchar2(20)
,spec_key varchar2(20)
,spec_name varchar2(20)
);
insert into note_pc(pcname,spec_key,spec_name) values ('FMV LIFEBOOK','CPU','Core i5 10210U');
insert into note_pc(pcname,spec_key,spec_name) values ('ThinkBook 14','CPU','Core i5 1235U');
insert into note_pc(pcname,spec_key,spec_name) values ('LAVIE N15','CPU','Ryzen 5 4500U');
insert into note_pc(pcname,spec_key,spec_name) values ('FMV LIFEBOOK','core','4コア');
insert into note_pc(pcname,spec_key,spec_name) values ('ThinkBook 14','core','10コア 1235U');
insert into note_pc(pcname,spec_key,spec_name) values ('LAVIE N15','core','6コア');
insert into note_pc(pcname,spec_key,spec_name) values ('FMV LIFEBOOK','メモリ','8G');
insert into note_pc(pcname,spec_key,spec_name) values ('ThinkBook 14','メモリ','16G');
insert into note_pc(pcname,spec_key,spec_name) values ('LAVIE N15','メモリ','8G');

PostgreSQL版はこちら

スポンサーリンク
コピペで使う