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

3-28 前年との大小関係を求める

SQLパズル

年度売上テーブル
年度  売上
----  ----
2000   100
2001   200
2002   300
2003   300
2004   600
2005   500
2006   400
2007   400

前年(1年前)と、売上を比較し、

売上が増えれば、成長
売上が減れば、後退
売上が変わらなければ、横ばい
前年がなければ、前年度なし
と出力する

出力結果
年度  売上  成長
----  ----  ----------
2000   100  前年度なし
2001   200  成長
2002   300  成長
2003   300  横ばい
2004   600  成長
2005   500  後退
2006   400  後退
2007   400  横ばい


データ作成スクリプト

create table 年度売上(
年度 number(4),
売上 number(4));

insert into 年度売上 values(2000,100);
insert into 年度売上 values(2001,200);
insert into 年度売上 values(2002,300);
insert into 年度売上 values(2003,300);
insert into 年度売上 values(2004,600);
insert into 年度売上 values(2005,500);
insert into 年度売上 values(2006,400);
insert into 年度売上 values(2007,400);
commit;


SQL

--■■■相関サブクエリを使う方法■■■
select 年度,売上,
case sign(売上-(select b.売上
                 from 年度売上 b
                where b.年度 = a.年度 -1))
     when  1 then '成長'
     when  0 then '横ばい'
     when -1 then '後退' else '前年度なし' end as 成長
  from 年度売上 a
order by 年度;

--■■■Lag関数を使う方法■■■
select 年度,売上,
case sign(売上 - Lag(売上) over(order by 年度))
     when  1 then '成長'
     when  0 then '横ばい'
     when -1 then '後退' else '前年度なし' end as 成長
  from 年度売上
order by 年度;


解説

sign関数で、
等号もしくは、不等号
を求めてます

マニュアル(Sign関数)(英語)