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');