【问题标题】:Unpivot the data with an incremental dates使用增量日期取消透视数据
【发布时间】:2017-08-07 10:52:59
【问题描述】:

您好,我有以下格式的数据Original Data


+------+---------+----------+-----------+---------+---------+---------+---------+ | Item | Channel | Location | STARTDATE | PERIOD1 | PERIOD2 | PERIOD3 | PERIOD4 | +------+---------+----------+-----------+---------+---------+---------+---------+ | A101 | Online | NY | 7/17/2017 | 1 | | 1 | | +------+---------+----------+-----------+---------+---------+---------+---------+ | A102 | Store | PV | 7/24/2017 | 1 | | 1 | 1 | +------+---------+----------+-----------+---------+---------+---------+---------+

我希望将 period1 替换为 startdate+7 天,将 period2 替换为 startdate+14 天等等,基本上是每周一次。


上面的数据应该是这样的: Final result

+------+---------+----------+-----------+-----------+-----+ | Item | Channel | Location | STARTDATE | Period | QTY | +------+---------+----------+-----------+-----------+-----+ | A101 | Online | NY | 7/17/2017 | 7/24/2017 | 1 | +------+---------+----------+-----------+-----------+-----+ | A101 | Online | NY | 7/17/2017 | 7/31/2017 | | +------+---------+----------+-----------+-----------+-----+ | A101 | Online | NY | 7/17/2017 | 8/7/2017 | 1 | +------+---------+----------+-----------+-----------+-----+ | A101 | Online | NY | 7/17/2017 | 8/14/2017 | | +------+---------+----------+-----------+-----------+-----+ | A102 | Store | PV | 7/24/2017 | 7/31/2017 | 1 | +------+---------+----------+-----------+-----------+-----+ | A102 | Store | PV | 7/24/2017 | 8/7/2017 | | +------+---------+----------+-----------+-----------+-----+ | A102 | Store | PV | 7/24/2017 | 8/14/2017 | 1 | +------+---------+----------+-----------+-----------+-----+ | A102 | Store | PV | 7/24/2017 | 8/21/2017 | 1 | +------+---------+----------+-----------+-----------+-----+

【问题讨论】:

  • 不要包含数据的屏幕截图,直接将其包含在问题中。无论如何,这可能是重复的。
  • 即使在将文本转换为表格后,我也尝试了很长时间来放置表格,但它不起作用:(

标签: sql oracle date unpivot


【解决方案1】:

这是我的创建和插入语句用于测试:

create table Testing
(
  ITEM varchar2(4),
  CHANNEL varchar2(10),
  LOCATION varchar2(2),
  STARTDATE date,
  PERIOD1 number,
  PERIOD2 number,
  PERIOD3 number,
  PERIOD4 number
  );

 insert into Testing
 values('A101','Online','NY',to_date('07/17/2017','MM/DD/YYYY'),1,cast(null as number),1,cast(null as number));
 insert into Testing
 values('A102','Store','PV',to_date('07/24/2017','MM/DD/YYYY'),1,cast(null as number),1,1);

之后,我能够创建这个 unpivot,只要您不关心空数量行,它就可以为您提供所需的内容:

select ITEM "Item", CHANNEL "Channel", LOCATION "Location", STARTDATE "StartDate", 
        STARTDATE + 7 * to_number(substr(PERIOD,-1)) "Period", QTY
 from 
 Testing
 unpivot(
    QTY for Period in (period1,period2,period3,period4)
 )

查询 1 的输出:

Item    Channel     Location    StartDate   Period      QTY
A101    Online      NY          17-JUL-17   24-JUL-17   1
A101    Online      NY          17-JUL-17   07-AUG-17   1
A102    Store       PV          24-JUL-17   31-JUL-17   1
A102    Store       PV          24-JUL-17   14-AUG-17   1
A102    Store       PV          24-JUL-17   21-AUG-17   1

如果出于某种原因您需要这些空行,则可以在取消透视之前在每个句点周围放置一个 NVL:

select ITEM "Item", CHANNEL "Channel", LOCATION "Location", STARTDATE "StartDate", 
        STARTDATE + 7 * to_number(substr(PERIOD,-1)) "Period", QTY
 from(
 select ITEM,CHANNEL,LOCATION,STARTDATE,nvl(PERIOD1,0) PERIOD1,nvl(PERIOD2,0) PERIOD2,nvl(PERIOD3,0) PERIOD3,nvl(PERIOD4,0) PERIOD4
 from Testing
 )
 unpivot(
    QTY for Period in (period1,period2,period3,period4)
 )

查询 2 的输出:

Item    Channel     Location    StartDate   Period      QTY
A101    Online      NY          17-JUL-17   24-JUL-17   1
A101    Online      NY          17-JUL-17   31-JUL-17   0
A101    Online      NY          17-JUL-17   07-AUG-17   1
A101    Online      NY          17-JUL-17   14-AUG-17   0
A102    Store       PV          24-JUL-17   31-JUL-17   1
A102    Store       PV          24-JUL-17   07-AUG-17   0
A102    Store       PV          24-JUL-17   14-AUG-17   1
A102    Store       PV          24-JUL-17   21-AUG-17   1

【讨论】:

    【解决方案2】:

    Connect By 带有Cross Join 的方法可以用作:

     with Inventory ( Item , Channel , Location , Startdate , Period1 , Period2 , Period3 , Period4 ) as
     (
       select 'A101', 'Online', 'NY', date'2017-07-17', 1, null, 1, null from dual union all
       select 'A102', 'Store' , 'PV', date'2017-07-24', 1, null, 1,    1 from dual   
     )
     select Item , Channel , Location , Startdate ,
            Startdate + 7 * lvl as Period,
            decode(lvl,1,period1,2,period2,3,period3,4,period4) as qty
       from Inventory i
       cross join ( select level lvl from dual connect by level <= 4 )
       order by item, lvl;
    
    ITEM    CHANNEL LOCATION    STARTDATE     PERIOD     QTY
    ----    ------- --------   -----------  ----------   ----
    A101    Online     NY      17.07.2017   24.07.2017    1
    A101    Online     NY      17.07.2017   31.07.2017   NULL
    A101    Online     NY      17.07.2017   07.08.2017    1
    A101    Online     NY      17.07.2017   14.08.2017   NULL
    A102    Store      PV      24.07.2017   31.07.2017    1
    A102    Store      PV      24.07.2017   07.08.2017   NULL
    A102    Store      PV      24.07.2017   14.08.2017    1
    A102    Store      PV      24.07.2017   21.08.2017    1
    

    Rextester Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-24
      • 1970-01-01
      • 1970-01-01
      • 2022-10-24
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      • 1970-01-01
      相关资源
      最近更新 更多