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

9-19 件数による多分岐

SQLパズル

Registerテーブル
course  instructor
------  ----------
    10  AAAAAAAAAA
    20  BBBBBBBBBB
    20  CCCCCCCCCC
    30  DDDDDDDDDD
    30  EEEEEEEEEE
    30  FFFFFFFFFF
    40  GGGGGGGGGG
    40  HHHHHHHHHH
    40  IIIIIIIIII
    40  JJJJJJJJJJ

courseごとに以下の形式で出力する。
instructor1には、名前が最小のinstructor
instructor2には、instructorが3人以上なら、more
                 instructorが2人なら、名前が最大のinstructor
                 instructorが1人だけなら、null

出力結果
course  instructor1  instructor2
------  -----------  -----------
    10  AAAAAAAAAA          null
    20  BBBBBBBBBB   CCCCCCCCCC
    30  DDDDDDDDDD   more
    40  GGGGGGGGGG   more

SQLパズル(日本語版)のパズル12 [先生] を参考にさせていただきました
SQLパズル 第2版のパズル13 [2人かそれ以上か、それが問題だ] を参考にさせていただきました


データ作成スクリプト

create table Register(
course     number(2),
instructor varchar2(10));

insert into Register values(10,'AAAAAAAAAA');
insert into Register values(20,'BBBBBBBBBB');
insert into Register values(20,'CCCCCCCCCC');
insert into Register values(30,'DDDDDDDDDD');
insert into Register values(30,'EEEEEEEEEE');
insert into Register values(30,'FFFFFFFFFF');
insert into Register values(40,'GGGGGGGGGG');
insert into Register values(40,'HHHHHHHHHH');
insert into Register values(40,'IIIIIIIIII');
insert into Register values(40,'JJJJJJJJJJ');
commit;


SQL

select course,min(instructor) as instructor1,
       case count(*) when 1 then null
                     when 2 then max(instructor)
                     else 'more' end as instructor2
  from Register
group by course
order by course;


解説

単純case式で多分岐させてます