トップページに戻る
次のSQLパズルへ
前のSQLパズルへ
10-30 行を指定単位で分割
SQLパズル
注文テーブル
商品名 注文数量
------ --------
A 500
A 1000
B 700
B 200
B 900
C 1500
発注単位テーブル
商品名 単位
------ ----
A 800
B 2000
C 300
商品単位で発注を行う。
但し、商品には発注単位があり、
発注単位の倍数単位にまとめて出力する。
出力結果
商品名 注文数量
------ --------
A 800
A 800
B 2000
C 300
C 300
C 300
C 300
C 300
データ作成スクリプト
create table 注文(
商品名 char(1),
注文数量 number(4));
insert into 注文 values('A', 500);
insert into 注文 values('A',1000);
insert into 注文 values('B', 700);
insert into 注文 values('B', 200);
insert into 注文 values('B', 900);
insert into 注文 values('C',1500);
create table 発注単位(
商品名 char(1),
単位 number(4));
insert into 発注単位 values('A', 800);
insert into 発注単位 values('B',2000);
insert into 発注単位 values('C', 300);
commit;
SQL
--■■■方法1■■■
select 商品名,注文数量
from (select 商品名,合計,
Row_Number() over(partition by 商品名 order by 1) as Row_Num,
(select b.単位 from 発注単位 b
where b.商品名=a.商品名) as 注文数量
from (select 商品名,sum(注文数量) as 合計
from 注文
group by 商品名) a,all_catalog)
where Row_Num <= ceil(合計/注文数量);
--■■■方法2■■■
select aa.商品名,aa.単位
from (select a.商品名,b.単位,
ceil(sum(a.注文数量)/b.単位) as 行数
from 注文 a,発注単位 b
where a.商品名 = b.商品名
group by a.商品名,b.単位) aa,
(select RowNum as Counter from dict) bb
where aa.行数 >= bb.Counter
order by aa.商品名;
解説
Row_Number() over(partition by 商品名 order by 1)で、
商品名ごとに、1からの自然数の連番を作成してます。