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

5-31 相関サブクエリで件数取得

SQLパズル

営業日テーブル
日付        営業日フラグ (営業日は1、休業日は0)
----------  ------------
2004-10-01        1
2004-10-02        0
2004-10-03        0
2004-10-04        1
2004-10-05        1
2004-10-06        1

2004/10/1から日付までの営業日の数を出力する。

出力結果
日付        営業日フラグ  営業日数
----------  ------------  --------
2004-10-01        1           1
2004-10-02        0           1
2004-10-03        0           1
2004-10-04        1           2
2004-10-05        1           3
2004-10-06        1           4


データ作成スクリプト

create Table 営業日テーブル(
日付         date,
営業日フラグ number(1));

insert into 営業日テーブル values(to_date('20041001','yyyymmdd'),1);
insert into 営業日テーブル values(to_date('20041002','yyyymmdd'),0);
insert into 営業日テーブル values(to_date('20041003','yyyymmdd'),0);
insert into 営業日テーブル values(to_date('20041004','yyyymmdd'),1);
insert into 営業日テーブル values(to_date('20041005','yyyymmdd'),1);
insert into 営業日テーブル values(to_date('20041006','yyyymmdd'),1);
commit;


SQL

--■■■count関数を使用■■■
select to_char(日付,'yyyy-mm-dd') as 日付,営業日フラグ,
(select count(b.営業日フラグ) from 営業日テーブル b
  where b.日付 <= a.日付
    and b.営業日フラグ=1) as 営業日数
from 営業日テーブル a
order by 日付;

--■■■sum関数を使用■■■
select to_char(日付,'yyyy-mm-dd') as 日付,営業日フラグ,
(select sum(b.営業日フラグ) from 営業日テーブル b
  where b.日付 <= a.日付) as 営業日数
from 営業日テーブル a
order by 日付;

--■■■分析関数を使用■■■
select to_char(日付,'yyyy-mm-dd') as 日付,営業日フラグ,
sum(営業日フラグ) over(order by 日付) as 営業日数
from 営業日テーブル
order by 日付;


解説

select句で相関サブクエリを使用して、営業日の数をカウントしてます。
分析関数を使う方法もあります。

7-1 累計を取得