トップページに戻る    次のSQLServerのサンプルへ    前のSQLServerのサンプルへ

2-1 金額を超える組み合わせ

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   int,
品物 varchar(6),
金額 int);

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


SQL

with rec(ID,IDリスト,合計金額) as(
select ID,cast(ID as VarChar(10)),金額
  from 果物
union all
select b.ID,
cast(a.IDリスト + ',' + cast(b.ID as VarChar(10)) as VarChar(10)),
a.合計金額 + b.金額
  from rec a,果物 b
 where a.ID < b.ID)
select a.TID,Row_Number() over(partition by a.TID order by b.ID) as ID,
b.品物,b.金額,a.合計金額
  from (select IDリスト,合計金額,
        Row_Number() over(order by IDリスト) as TID from rec) a
  Join 果物 b on CharIndex(cast(b.ID as VarChar),',' + a.IDリスト + ',') > 0
 where a.合計金額 > 1500
go


解説

再帰SQLで組み合わせを列挙してます。