将行拆分为多行PL / SQL

时间:2014-07-03 18:54:11

标签: sql oracle plsql

是否有一种简单的方法可以将行的值拆分为多行?例如,假设我有下表

项目日期数量类型
2001 7/1/2014 5000 5
2001年7月6日1000 1
2002 7/20/2014 3000 1
2003 7/1/2014 2000 5
2004 8/3/2014 4000 4

我打算做的是采取4或5型的物品,取其数量,按类型划分所述数量(例如5000/5),并在接下来的n周内均匀分配结果,取决于类型(即,类型5为5周,类型4为4周)。最后,将该拆分结果添加到该周的任何其他结果中。

例如,我们有7月份的6000项目2001。每周将有1000个项目2001,除了从7/6开始的那一周,那里将有2000个。

这是I' m寻求的输出

输出看起来像这样

项目日期数量
2001 7/1/2014 1000
2001年7月6日2014年(分裂1000张,上表1张1000张)
2001年7月13日1000
2001年7月20日1000
2001 7/27/2014 1000

我不太确定会雇用。我怀疑带有循环的子查询将是一个开始。

1 个答案:

答案 0 :(得分:0)

这个非常接近,但分裂的时间恰好是7,14,21,28天。在您的示例中,7/6/14从7/1/14获得1000,下面的声明将不提供,因为2014年7月1日的分割将转到7/8/2014,2014年7月15日等也许这只是你问题上的一点疏忽;否则,查询需要更多工作才能更好地匹配日期。

create table sales (item number(4), sdate date, quantity number, stype number(1));

with dategenerator as (select to_date('1.1.2014')+(rownum-1) sdate from dual connect by rownum<=365),
prodlist as (select distinct item from sales),
salessplitted as (
select prodlist.item, dategenerator.sdate, 
   (select nvl(sum(quantity),0) from sales where sdate=dategenerator.sdate and item=prodlist.item and stype=1)+
   (select nvl(sum(quantity/4),0) from sales where sdate in (dategenerator.sdate,dategenerator.sdate-7,dategenerator.sdate-14,dategenerator.sdate-21) and item=prodlist.item and stype=4)+
   (select nvl(sum(quantity/5),0) from sales where sdate in (dategenerator.sdate,dategenerator.sdate-7,dategenerator.sdate-14,dategenerator.sdate-21,dategenerator.sdate-28) and item=prodlist.item and stype=5) total
  from dategenerator, prodlist )
select item, sdate, total from salessplitted where total>0
order by item, sdate;