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

9-41 縦横変換してから集計

SQLパズル

Raceテーブル
RaceID  one    two    three
------  -----  -----  -----
     1  Wendy  Heidy  Tiger
     2  Scott  Heidy  Sundy
     3  Heidy  Sundy  Wendy
     4  Heidy  Tiger  Wendy

oneは、5ポイント
twoは、3ポイント
threeは、1ポイント
として、以下の形式でポイントの合計を出力する。

出力結果
Racer  point
-----  -----
Heidy     16
Scott      5
Sundy      4
Tiger      4
Wendy      7

SQLパズル(日本語版)のパズル49 [競馬の稼ぎ] を参考にさせていただきました
SQLパズル 第2版のパズル55 [競走馬の入賞回数] を参考にさせていただきました


データ作成スクリプト

create table Race(
RaceID number(1),
one    varchar2(5),
two    varchar2(5),
three  varchar2(5));

insert into Race values(1,'Wendy','Heidy','Tiger');
insert into Race values(2,'Scott','Heidy','Sundy');
insert into Race values(3,'Heidy','Sundy','Wendy');
insert into Race values(4,'Heidy','Tiger','Wendy');
commit;


SQL

--■■■カウンタテーブルと結合させる方法■■■
select Racer,sum(point) as point
  from (select case b.Counter
               when 1 then one
               when 2 then two
               when 3 then three end as Racer,
        case b.Counter
        when 1 then 5
        when 2 then 3
        when 3 then 1 end as point
          from Race a,(select 1 as Counter from dual
             union all select 2 from dual
             union all select 3 from dual) b)
group by Racer
order by Racer;

--■■■インラインビューでunionを使う方法■■■
select Racer,sum(point) as point
    from (select one as Racer,5 as point from Race
union all select two,3 from Race
union all select three,1 from Race)
group by Racer
order by Racer;


解説

インラインビューでunionを使う方法は、分かりやすいのですが
表をスキャンする回数が増えてしまいます。