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

10-7 累計が100以上になるまで出力(負数なし)

SQLパズル

GetPointテーブル
ID  Point
--  -----
 1     30
 2     30
 3     30
 4     20
 5     70
 6      5
 7      0
 8     18
 9     33

GetPointテーブルからIDの昇順にPointの合計が100以上になるまで
IDとPointを出力する。
Pointに負数は存在しない(Pointの累計は、IDに対して単調増加である)

出力例
ID  Point
--  -----
 1     30
 2     30
 3     30
 4     20


データ作成スクリプト

create table GetPoint(
ID    number(1),
Point number(2),
Primary key(ID));

insert into GetPoint values(1,30);
insert into GetPoint values(2,30);
insert into GetPoint values(3,30);
insert into GetPoint values(4,20);
insert into GetPoint values(5,70);
insert into GetPoint values(6, 5);
insert into GetPoint values(7, 0);
insert into GetPoint values(8,18);
insert into GetPoint values(9,33);
commit;


SQL

--■■■相関サブクエリを使う方法■■■
select ID,Point
  from GetPoint a
where (select nvl(sum(b.Point),0) from GetPoint b
         where b.ID < a.ID) < 100
order by ID;

--■■■分析関数を使う方法1■■■
select ID,Point
from (select ID,Point,Lag(累計,1,0) over(order by ID) as Lag累計
        from (select ID,Point,sum(Point) over(order by ID) as 累計
                from GetPoint))
where Lag累計 < 100
order by ID;

--■■■分析関数を使う方法2■■■
select ID,Point
  from (select ID,Point,sum(Point) over(order by ID) as 累計
          from GetPoint)
where 累計 - Point < 100
order by ID;


解説

自分よりIDが小さいレコードの、
Pointの総合計が100未満であれば出力してます。