簡體   English   中英

填寫缺少的數據Oracle

[英]fill missing data 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. 序列中不可為Nullable是可以忽略的。

所以滾動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小時的回復。 男人睡了 但是你真的很感激你花在這上面的時間。

以下查詢可能會滿足您的需求。 如果沒有,請解釋與您的要求相比有何不同。 (請回答我在評論中提出的問題)。

在這個解決方案中,我生成了所需的日期(首先是星期日,因為你想捕獲“當前周”期間發生的事情,然后我在最后的外部查詢中將它們更改為星期一)。 我也從你提供的表中生成order_no ,但是在一個有意義的現實生活中,這是不必要的; 你應該有一個“order”表,其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
;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM