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

2-3-8 過去の最高売上を取得

SQLパズル

売上テーブルから、担当者IDごと、年月ごとに、
年月時点での最高売上を表示する。

売上テーブル
担当者ID    年月    売上
--------  ------   ----
       1  200501   1000
       1  200502    500
       1  200503   2000
       1  200504   1500
       2  200501   1000
       2  200502   1500
       2  200503   1000
       2  200504   2000
       3  200501   1000
       3  200502   1500
       3  200503   1000

出力結果
担当者ID    年月    売上   最高売上
--------  ------   ----   --------
       1  200501   1000       1000
       1  200502    500       1000
       1  200503   2000       2000
       1  200504   1500       2000
       2  200501   1000       1000
       2  200502   1500       1500
       2  200503   1000       1500
       2  200504   2000       2000
       3  200501   1000       1000
       3  200502   1500       1500
       3  200503   1000       1500


データ作成スクリプト

create table 売上テーブル(
担当者ID number(1),
年月 char(6),
売上 number(4));

insert into 売上テーブル values(1,'200501',1000);
insert into 売上テーブル values(1,'200502', 500);
insert into 売上テーブル values(1,'200503',2000);
insert into 売上テーブル values(1,'200504',1500);
insert into 売上テーブル values(2,'200501',1000);
insert into 売上テーブル values(2,'200502',1500);
insert into 売上テーブル values(2,'200503',1000);
insert into 売上テーブル values(2,'200504',2000);
insert into 売上テーブル values(3,'200501',1000);
insert into 売上テーブル values(3,'200502',1500);
insert into 売上テーブル values(3,'200503',1000);
commit;


SQL

--■■■相関サブクエリを使う方法■■■
select 担当者ID,年月,売上,
(select max(b.売上) from 売上テーブル b
  where b.担当者ID=a.担当者ID
    and b.年月 <= a.年月) as 最高売上
from 売上テーブル a
order by 担当者ID;

--■■■分析関数を使う方法■■■
select 担当者ID,年月,売上,
max(売上) over(partition by 担当者ID order by 年月) as 最高売上
from 売上テーブル
order by 担当者ID;


解説

分析関数を使う方法では、
windowing_clauseを省略すると、
Range between unbounded preceding and current rowになることを使ってます。