填写缺少的数据Oracle

时间:2016-08-22 11:54:01

标签: sql oracle

相信我,我已经试着找到这个问题。我有MYSQL& SQLServer解决方案而不是Oracle而不是我需要的具体汇总。 由于我正在使用的Oracle版本中没有Cross Apply,我遇到了障碍。

许多人的问题很简单。

对我而言,宇宙起步已经持续了13个月。

我有一张表

CREATE TABLE TBLTESTAUM (
ORDER_NO NUMBER(10,0) NOT NULL ENABLE,
RECORD_DATE DATE,
Order_SEQUENCE NUMBER(5,0) NOT NULL ENABLE,
CLASS NUMBER(3,0));

INSERT INTO TBLTESTAUM VALUES (1234, '29-Aug-2015', 34, 459);
INSERT INTO TBLTESTAUM VALUES (1234, '20-Jun-2016', 35, 877);
INSERT INTO TBLTESTAUM VALUES (1234, '20-Jun-2016', 37, 877);
INSERT INTO TBLTESTAUM VALUES (1234, '02-Jul-2016', 39, 122);
INSERT INTO TBLTESTAUM VALUES (1234, '28-Jul-2016', 40, 122);
INSERT INTO TBLTESTAUM VALUES (1234, '31-Jul-2016', 41, 311);
INSERT INTO TBLTESTAUM VALUES (1234, '10-Aug-2016', 42, 311);
INSERT INTO TBLTESTAUM VALUES (1234, '18-Aug-2016', 44, 110);
INSERT INTO TBLTESTAUM VALUES (1234, '20-Aug-2016', 45, 110);

请注意:

  1. 2015年7月20日第一次插入。
  2. Seq字段可能有也可能没有每个值。它可能会遗漏一些。如果你想使用它。
  3. 序列中不可为空是可忽略的。
  4. 所以滚动13个月给了我22/07/2015,截至今天。

    我希望在每周“CLASS”情况下将其分解,如果那个星期没有任何内容,那么最后一次应用CLASS。如果没有任何结果,即它是第一个实例,则接下来应用CLASS。直到CLASS更改。

    输出为 -

    Order Num   WeekDate    CLASS
    123         27-Jul-15   459
    123         3-Aug-15    459
    123         10-Aug-15   459
    123         17-Aug-15   459
    123         24-Aug-15   459
    123         31-Aug-15   459
    123         7-Sep-15    459
    Dates and Order Num to continue till next match in TBLTESTAUM is found
    123         20-Jun-16   877
    123         27-Jun-16   122
    123         4-Jul-16    122
    123         11-Jul-16   122
    123         25-Jul-16   311
    123         1-Aug-16    311
    123         8-Aug-16    311
    123         15-Aug-16   110
    123         22-Aug-16   110
    

    有多个订单号。但我希望你的代码适合所有人。 请注意

    它需要累积到每周状态 需要执行月度状态。但希望我能从你的代码中找到答案。

    提前谢谢。

    PS:我将无法查看您未来10小时的回复。男人睡了但是非常感谢你花在这上面的时间。

1 个答案:

答案 0 :(得分:1)

以下查询可能会满足您的需求。如果没有,请解释与您的要求相比有什么不同。 (请回答我在评论中提出的问题)。

在这个解决方案中,我生成了所需的日期(首先是星期日,因为你想要捕捉"当前周"发生的事情,然后我在最后的外部查询中将它们更改为星期一)。我还会从您提供的表格中生成order_no,但是在一个有意义的现实生活中,不一定是必要的;你应该有一个"命令"具有相同order_no作为主键的表,以及我的CTE" o"应该从该表中提取订单号,而不是从tbltestaum

祝你好运!

with
     w ( weekdate ) as (
       select trunc(sysdate, 'iw') - 7 * (level - 1) + 6  -- This will generate Sundays
       from   dual
       connect by level <= 1 + 
                   ( trunc(sysdate, 'iw') - trunc(add_months(sysdate, -13), 'iw') ) / 7
     ), 
     o ( order_no ) as (
       select distinct order_no from tbltestaum
     ),
     prep ( order_no, dt, order_sequence, class ) as (
       select order_no, record_date, order_sequence, class
         from tbltestaum
       union all
       select order_no, weekdate, null, null
         from w cross join o
     ),
     z ( order_no, dt, order_sequence, class ) as (
       select order_no, dt, order_sequence,
              nvl( last_value(class ignore nulls) over (partition by order_no 
                                                        order by dt, order_sequence),
                  first_value(class ignore nulls) over (partition by order_no
                                                        order by dt, order_sequence
                             rows between unbounded preceding and unbounded following ) )
       from   prep
     )
select order_no, to_char(dt - 6, 'dd-Mon-yy') as weekdate, class
from   z
where  order_sequence is null
;