2017-12-19 4 views
-1

私は結果として以下のような結果を得ようとしました。 注:jan-2016からjan-2018までの月があります。 2種類のどちらか「HIST」または「未来」 その結果得られたデータセット、があります。この例では :私の計算ロジックが依存ID1の組み合わせ+ ID2 + ID3oracleでlead lag関数を使用する方法

type month  id1 id2 id3 value 
hist jan-17  1 2 3  10 
hist feb-17  1 2 3  20 
future jan-17  1 2 3  15 
future feb-17  1 2 3  1 
hist mar-17  1 2 3  2 
future apr-17  1 2 3  5 

1,2,3として考えてみましょう月の四半期数。 たとえば、 1月の1ヶ月(四半期の最初の1ヶ月)の値は、j​​anの将来+ febの将来価値+ marchの将来価値です。 jan-17の場合、出力は次のようになります。15 + 1 + 0(対応する将来の値はありません)

feb(第2四半期) feb + future of march ie 10 + 1 + 0(3月の未来は利用できません)

同様に月の月の値は次のようになります:jan + history of feb + history of marchすなわち10+ 20 + 0(3月のフリーキャストは存在しない)。 4月のための同様

は、may.juneは

私はリードラグ機能の承知していますが、私は、誰かが助けてくださいすることができ、ここで それを適用することはできませんよ(月の四半期の数に応じて)

+0

"私はいくつかのクエリを書いています..."。あなたの質問はどこですか?私はそれを見ない。 – Eric

+0

私はあなたのロジックを理解していません。 jan-17にはどのような実際の価値を示したいのですか?また、feb-17の将来価値については20年代はどこから来るのですか?ヒスト?なぜfeb-17とmar-17しかないのですか?あなたはいつも3ヶ月の窓を探していますか? jan-17の 'hist'値が適切でないのはなぜですか?ロジックについてもっと詳しく説明してください。さらにサンプルデータと期待される結果を追加すると、おそらく役に立ちます。 –

+0

こんにちはアレックス!!私は質問を編集しました。今理解できるかどうか教えてください – joe

答えて

0

WITH 
    dset 
    AS 
     (SELECT DATE '2017-01-17' month, 5 VALUE 
      FROM DUAL 
     UNION ALL 
     SELECT DATE '2017-02-17' month, 6 VALUE 
      FROM DUAL 
     UNION ALL 
     SELECT DATE '2017-03-25' month, 7 VALUE 
      FROM DUAL 
     UNION ALL 
     SELECT DATE '2017-05-25' month, 4 VALUE 
      FROM DUAL) 
    SELECT SUM (VALUE) value_sum, TO_CHAR (month, 'q') quarter, TO_CHAR (month, 'YYYY') year 
    FROM dset 
GROUP BY TO_CHAR (month, 'q'), TO_CHAR (month, 'YYYY'); 

この結果で:

私は遅れと混乱、これあなたがあなたの日付を四半期に変換する場合、すべてのことで、グループで行うことができないだろう

あなたは、各レコードに結果が必要な場合は、私たちは分析関数を使用することができます。これは、その結果

SELECT SUM (VALUE) OVER (PARTITION BY TO_CHAR (month, 'q'), TO_CHAR (month, 'YYYY')) quarter_sum, month, VALUE 
    FROM dset 

QUARTER_SUM MONTH  VALUE 
18   1/17/2017 5 
18   2/17/2017 6 
18   3/25/2017 7 
4   5/25/2017 4 

は今年、あなたには、特定の作り、あなたが結合したくありません異なる年の四半期。

+0

こんにちはブライアン!!答えをありがとう、しかし私はあなたが私の質問を誤解したと思う。私はそれが歴史か未来かのタイプに基づいてそれを合計しました – joe

+0

私の心を変え、コメントを削除する方法を知らない。 –

+0

@joeあなたのご意見を理解していません。私のコードは四半期ごとに値を合計します。あなたのラベル「FUTURE」と「HISTORY」は、あなたのステートメントで定義した文脈で何も意味するものではありません。* febの月(第2四半期)の値は次のとおりです。マーチすなわち10 + 1 + 0(3月の未来は利用できません)* "。あなたの質問を読んだ後、あなたは単に四半期ごとに合計を求めています。これは私のコードがしているものです。 –

0

まあ、コメントの1つで述べたように、トリックはあなたの別の質問にあります&対応する答え。まあ...これはいくぶんこのようになります。

with 
x as 
    (select 'hist' type, To_Date('JAN-2017','MON-YYYY') ym , 10 value from dual union all 
    select 'future' type, To_Date('JAN-2017','MON-YYYY'), 15 value from dual union all 
    select 'future' type, To_Date('FEB-2017','MON-YYYY'), 1 value from dual), 
y as 
    (select * from x Pivot(Sum(Value) For Type in ('hist' as h,'future' as f))), 
    /* Pivot for easy lag,lead query instead of working with rows..*/ 
z as 
    (
     select ym,sum(h) H,sum(f) F from (
      Select y.ym,y.H,y.F from y 
      union all 
      select add_months(to_Date('01-JAN-2017','DD-MON-YYYY'),rownum-1) ym, 0 H, 0 F 
      from dual connect by rownum <=3 /* depends on how many months you are querying... 
      so this dual adds the corresponding missing 0 records...*/ 
     ) group by ym 
    ) 
select 
ym, 
Case 
    When MOD(Extract(Month from YM),3) = 1 
    Then F + Lead(F,1) Over(Order by ym) + Lead(F,2) Over(Order by ym) 
    When MOD(Extract(Month from YM),3) = 2 
    Then Lag(H,1) Over(Order by ym) + F + Lead(F,1) Over(Order by ym) 
    When MOD(Extract(Month from YM),3) = 3 
    Then Lag(H,2) Over(Order by ym) + Lag(H,1) Over(Order by ym) + F 
End Required_Value 
from z 
関連する問題