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

6-6 金額を超える組み合わせ(テーブル版)

SQLパズル

果物テーブル
ID  品物    金額
--  ------  ----
 1  りんご   200
 2  みかん   500
 3  もも     600
 4  かき     400
 5  いちご   800

果物テーブルから、1500円を超える組み合わせを出力する(TID列は、組み合わせ番号)

出力結果
TID  ID    品物  金額   合計金額
---  --  ------  ----  --------
  4   1  りんご   200      1700
  4   2  みかん   500      1700
  4   3  もも     600      1700
  4   4  かき     400      1700
  5   1  りんご   200      2500
  5   2  みかん   500      2500
  5   3  もも     600      2500
  5   4  かき     400      2500
  5   5  いちご   800      2500


データ作成スクリプト

create table 果物(
ID   number(1),
品物 varchar2(6),
金額 number(3));

insert into 果物 values(1,'りんご',200);
insert into 果物 values(2,'みかん',500);
insert into 果物 values(3,'もも'  ,600);
insert into 果物 values(4,'かき'  ,400);
insert into 果物 values(5,'いちご',800);
commit;


SQL

--■■■RowIDを使わない方法■■■
select TID,ID,品物,金額,合計金額
from (select a.TID,b.ID,b.品物,b.金額,
      sum(b.金額) over(partition by a.TID) as 合計金額
      from (select RowNum as TID,
            sys_connect_by_path(to_char(ID),',') as 組み合わせ
            from 果物
            connect by prior ID < ID) a,果物 b
      where instr(a.組み合わせ,to_char(b.ID)) > 0)
where 合計金額 > 1500;

--■■■RowIDを使う方法■■■
select TID,ID,品物,金額,合計金額
from (select a.TID,b.ID,b.品物,b.金額,
      sum(b.金額) over(partition by a.TID) as 合計金額
      from (select RowNum as TID,
            sys_connect_by_path(RowIDToChar(RowID),',') as 組み合わせ
            from 果物
            connect by prior ID < ID) a,果物 b
      where instr(a.組み合わせ,RowIDToChar(b.RowID)) > 0)
where 合計金額 > 1500;


解説

階層問い合わせで、2の5乗-1 = 31 通りの組み合わせを列挙してます。