将行拆分为多行 PL/SQL
Posted
技术标签:
【中文标题】将行拆分为多行 PL/SQL【英文标题】:Split rows into multiple rows PL/SQL 【发布时间】:2014-08-25 00:38:29 【问题描述】:有没有一种简单的方法可以将一行的值拆分为多行?例如,假设我有下表
商品 日期 数量 类型 2001 7/1/2014 5000 5 2001 7/6/2014 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 个。
这是我正在寻找的输出
输出看起来像这样
项目 日期 数量 2001 7/1/2014 1000 2001 7/6/2014 2000 (1000 来自上表中的拆分和 1000 来自上表中的类型 1) 2001 7/13/2014 1000 2001 7/20/2014 1000 2001 7/27/2014 1000
我不确定是否要雇用。我怀疑带有循环的子查询将是一个开始。
【问题讨论】:
你有什么尝试吗?向我们展示您的代码。您能否还添加表格外观的输出? 应该可以使用分析函数和窗口集以及运行总计和简单数学。 为什么要存储过程? @xQbert,我对窗口集不太熟悉。我会研究它们,看看如何实现它们 @a_horse_with_no_name,其他的方案我不熟悉,xQbert提出了其中一种方案 【参考方案1】:这一天非常接近,但分裂正好可以追溯到 7、14、21、28 天。在您的示例中,7/6/14 从 7/1/14 获得 1000,下面的语句不会提供,因为 7/1/2014 的拆分为 7/8/2014、7/15/2014 等.也许这只是你问题的一个小疏忽;否则,查询需要更多工作才能更好地匹配日期。
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;
【讨论】:
以上是关于将行拆分为多行 PL/SQL的主要内容,如果未能解决你的问题,请参考以下文章