2016-08-22 10 views
4

私はこの問題のために私の運を試してみました。私はMYSQL & SQLServerソリューションを持っていて、Oracleではなく、必要な特定のロールアップには対応していません。 使用しているOracleのバージョンでは、クロス・アプライを使用できないため、ロード・ブロックをヒットします。不足データを記入Oracle

多くの人にとって問題は簡単です。

私の宇宙の始まりは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. 20/7月/ 2015年最初のインサートに。
  2. Seqフィールドにはそれぞれの値がある場合とない場合があります。それはいくつかが欠けているかもしれません。それを使用したい場合。
  3. シーケンスのNullableは無視できません。

したがって、13日のローリングで今日の22/07/2015が表示されます。

毎週「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 

複数の注文numがあります。しかし、私はあなたのコードがすべてに適合することを願っています。 注記

週間ステータスにロールアップする必要があります。
月額ステータスを行う必要があります。しかし、うまくいけば、私はあなたのコードからそれを理解することができます。

ありがとうございます。

PS:今後10時間は回答を見ることができません。男は眠れました。しかし、本当にあなたがこれに費やす時間を感謝します。

+1

予想された結果と以前に使用したクエリも表示してください。 – jarlh

+0

なぜあなたは横方向結合(cross-joining)が必要だと思いますか? –

+0

@jarlh私は一枚ずつしていました。何らかの理由でハイパーリンクの書式設定が間違っていました。そして、それは私にエラーを与えた、コード書式が間違っていると言っている。 – SeeWe

答えて

1

以下のクエリは、必要な処理を行う場合があります。そうでない場合は、あなたの要件に比べて何が違うか説明してください。 (あなたの質問に私のコメントで尋ねた質問にも答えてください)。

この解決策では、「今週」の間に何が起こったのかを把握したいので、最初に日曜日として必要な日数を生成し、最後の外部クエリで月曜日に変更します。私はあなたが提供したテーブルからorder_noを生成しますが、必要ではない意味のある現実の状況にします。プライマリキーと同じorder_noを持つ「orders」テーブルが必要で、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 
; 
+0

これは私が以前言った要件のために動作します。しかし、私が以前に言ったように、次の月曜日です。私はそれに合わせてクエリを変更しようとしています。それが動作しない場合は、私に戻ってみましょう。でもありがとう。 – SeeWe

+1

OK、私は書き直します - 将来同じ質問があるかもしれない他のSOメンバーを助けるかもしれないという希望で。 – mathguy

+1

実際には書き直す必要はありません。先週の変更を月曜日の朝にピックアップするには、次のようなマイナーな変更が必要です(月曜日に起こったことがその週の終わりにのみ取得されたと仮定します):コードの3行目から+6を削除し、下から3行目。次に、last_valueのorder by部分とfirst_value(どちらの場合も閉じ括弧の直前)にorder_sequenceの後に "nulls first"を追加します。月曜日に何が起こるのかを、月曜日に影響を与えたい場合は、次のものではなく、もっと簡単です。+6と-6だけを削除します。 – mathguy

関連する問題