将行拆分为多行 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的主要内容,如果未能解决你的问题,请参考以下文章

Bash:将行拆分为多行[重复]

将行拆分为多行 Oracle

PL/SQLPL/SQL中动态执行SQL语句

PL/SQLPL/SQL过程

根据持续时间将行拆分为多行

基于逗号将行拆分为多行:一个班轮解决方案