トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

10-74 Oracle8での順位による制御

SQLパズル

table_test
OYA_NO  KO_NO
------  -----
A         KA1
A         KA2
A         KA3
B         KB1
C         KC1
C         KC2
D         KD1
D         KD2
D         KD3
D         KD4
D         KD5

OYA_NOごとに、
2行を1行にまとめて出力する(Oracle8のSQLで行う)

出力結果
OYA_NO  Left  Right
------  ----  -----
A        KA1    KA2
A        KA3   null
B        KB1   null
C        KC1    KC2
D        KD1    KD2
D        KD3    KD4
D        KD5   null


データ作成スクリプト

create table table_test(
oya_no char(1),
ko_no  char(3));

insert into table_test values('A','KA1');
insert into table_test values('A','KA2');
insert into table_test values('A','KA3');
insert into table_test values('B','KB1');
insert into table_test values('C','KC1');
insert into table_test values('C','KC2');
insert into table_test values('D','KD1');
insert into table_test values('D','KD2');
insert into table_test values('D','KD3');
insert into table_test values('D','KD4');
insert into table_test values('D','KD5');
commit;


SQL

col oya_no for a6
col Left   for a6
col Right  for a6

select oya_no,
max(decode(mod(cnt,2),1,ko_no)) as Left,
max(decode(mod(cnt,2),0,ko_no)) as Right
from (select t1.oya_no,t1.ko_no,count(t2.ko_no) as cnt
        from table_test t1,table_test t2
       where t1.oya_no = t2.oya_no
         and t1.ko_no >= t2.ko_no
       group by t1.oya_no, t1.ko_no)
group by oya_no,ceil(cnt/2)
order by oya_no,ceil(cnt/2);


解説

自己結合を使って、順位を求めてます