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

10-29 要素数が1の集合同士の直積

SQLパズル

商品テーブル
商品NO     商品名   単価
------   --------   ----
   100     レモン     80
   200   アップル    100

売上テーブル
売上NO   商品NO    数量
------   ------   ----
     1      100     10
     2      100     20
     3      100     30
     4      200     25
     5      200     50
     6      200     80

各商品毎の売上合計を以下の形式で出力する。

出力結果
レモン  レモン売上合計   アップル  アップル売上合計
------  --------------  -------  ---------------
レモン           4,800  アップル           15,500


データ作成スクリプト

create table 商品(
商品NO number(3),
商品名 varchar2(8),
単価   number(3));

insert into 商品 values(100,'レモン'  , 80);
insert into 商品 values(200,'アップル',100);

create table 売上(
売上NO number(1),
商品NO number(3),
数量   number(2));

insert into 売上 values(1,100,10);
insert into 売上 values(2,100,20);
insert into 売上 values(3,100,30);
insert into 売上 values(4,200,25);
insert into 売上 values(5,200,50);
insert into 売上 values(6,200,80);
commit;


SQL

col レモン売上合計 for a20
col アップル売上合計 for a20

--■■■要素数が1の集合同士で直積演算させる方法■■■
select レモン,to_char(レモン売上合計,'999,999') as レモン売上合計,
アップル,to_char(アップル売上合計,'999,999') as アップル売上合計
from (select 'レモン' as レモン,
      単価 * (select sum(b.数量) from 売上 b
               where b.商品NO=a.商品NO) as レモン売上合計
        from 商品 a
       where 商品名 = 'レモン'),
     (select 'アップル' as アップル,
      単価 * (select sum(b.数量) from 売上 b
               where b.商品NO=a.商品NO) as アップル売上合計
        from 商品 a
       where 商品名 = 'アップル');

--■■■結合を使う方法■■■
select 'レモン',
to_char(sum(decode(a.商品名,'レモン',b.数量*a.単価,0)),'999,999') as レモン売上合計,
'アップル',
to_char(sum(decode(a.商品名,'アップル',b.数量*a.単価,0)) ,'999,999') as アップル売上合計
from 商品 a,売上 b
where a.商品NO=b.商品NO;


解説

要素数が1の集合同士で直積演算させた集合の要素数は、
1となります(1*1=1)