2017-01-30 13 views
0

私はちょうど今、このクエリを解決するロジックを取得しています。下の表と出力を探します。 2つの列IDと日付に一致する表Aと表Bがあります。 Dateが一致した場合は、qtyにパーセントを掛けて、前のパーセントを選択する必要があります。Oracle SQLクエリの前の行の結果

Table A     Table B  
ID Date Percent  ID Date Qty 
A 01/01/17 0.5  A 01/01/17 10 
A 04/01/17 1  A 02/01/17 20 
A 06/01/17 2  A 03/01/17 30 
B 02/01/17 5  A 05/01/17 40 
B 05/01/17 10  A 06/01/17 50 
         A 07/01/17 60 
         A 08/01/17 40 
         B 01/01/17 10 
         B 02/01/17 50 

============================================ 

column column column comment comment comment 
    ID Date  Qty   Previous percent if row not matched 
    A 01/01/17 0.5 * 10   0.5 got new percent 
    A 02/01/17 0.5 * 20   0.5 
    A 03/01/17 0.5 * 30   0.5 
    A 04/01/17 1* 0    1 got new percent but no qty found 
    A 05/01/17 1 * 40    1 
    A 06/01/17 2 * 50    2 got new percent 
    B 01/01/17 10 * 0    0 no percent found 
    B 02/02/17 5 * 10    5 got new percent 
    B 5/1/17  10 * 0   10 got new percent 
+0

"出力" テーブル(??)は、入力テーブルのいずれかに存在しない日付04/01/17、の行を示しています。どうして?それは要件の一部ですか?そうであれば、投稿を更新して明示的にしてください。 – mathguy

+0

@mathguy:04/01/17は、表Aの第2行にある。 –

+0

@BobJarvis - Ugh。私は本当に表Bを意味しました。より一般的には、最終結果にすべての月が存在するという要件がありますか?しかし、私は出力の残りを見て、それは意味をなさない。例えば5/5/17は何ですか? (出力の最後の行)「出力」を無視し、問題を「自分の方法」と解釈することにしました。 – mathguy

答えて

0

私は、「表Bにさらにいくつかの列を追加」を意味する問題を解釈する - 表Aからその日を示す「最新」の割合、および表Bから「総数量」を表示するようにし、適切なパーセンテージを掛けて「正味量」を計算します。

表Aの各行に1つの行が必要な場合は、一番外側のクエリ(クエリの末尾にある)からWHERE句を削除するだけです。

with table_a (id, dt, pct) as (
     select 'A', to_date('01/01/17', 'mm/dd/rr'), 0.5 from dual union all 
     select 'A', to_date('04/01/17', 'mm/dd/rr'), 1 from dual union all 
     select 'A', to_date('06/01/17', 'mm/dd/rr'), 2 from dual union all 
     select 'B', to_date('02/01/17', 'mm/dd/rr'), 5 from dual union all 
     select 'B', to_date('05/01/17', 'mm/dd/rr'), 10 from dual 
), table_b (id, dt, qty) as (
     select 'A', to_date('01/01/17', 'mm/dd/rr'), 10 from dual union all 
     select 'A', to_date('02/01/17', 'mm/dd/rr'), 20 from dual union all 
     select 'A', to_date('03/01/17', 'mm/dd/rr'), 30 from dual union all 
     select 'A', to_date('05/01/17', 'mm/dd/rr'), 40 from dual union all 
     select 'A', to_date('06/01/17', 'mm/dd/rr'), 50 from dual union all 
     select 'A', to_date('07/01/17', 'mm/dd/rr'), 60 from dual union all 
     select 'A', to_date('08/01/17', 'mm/dd/rr'), 40 from dual union all 
     select 'B', to_date('01/01/17', 'mm/dd/rr'), 10 from dual union all 
     select 'B', to_date('02/01/17', 'mm/dd/rr'), 50 from dual 
) 
-- end of test data (not part of the SQL query); query begins BELOW THIS LINE 
select id, qty_date, pct_date, qty as gross_qty, pct, qty * pct as net_qty 
from  (select id, dt as qty_date, 
        last_value(case flag when 0 then dt end ignore nulls) 
            over (partition by id order by dt) as pct_date, 
        last_value(pct ignore nulls) 
            over (partition by id order by dt, flag) as pct, 
        qty, flag 
      from (select id, dt, pct, null as qty, 0 as flag 
         from table_a 
        union all 
        select id, dt, null as pct, qty, 1 as flag 
         from table_b 
       ) 
     ) 
where flag = 1  
order by id, qty_date  -- if needed 
; 

出力

ID QTY_DATE PCT_DATE GROSS_QTY  PCT NET_QTY 
-- ---------- ---------- ---------- ---------- ---------- 
A 2017-01-01 2017-01-01   10   .5   5 
A 2017-02-01 2017-01-01   20   .5   10 
A 2017-03-01 2017-01-01   30   .5   15 
A 2017-05-01 2017-04-01   40   1   40 
A 2017-06-01 2017-06-01   50   2  100 
A 2017-07-01 2017-06-01   60   2  120 
A 2017-08-01 2017-06-01   40   2   80 
B 2017-01-01     10 
B 2017-02-01 2017-02-01   50   5  250 

9 rows selected. 
+0

A 2017-05-01 2017-04-01 40 1 40 <<この行は間違っています... A 2017-04-01 2017-04-01 Null 1 0別の行を追加するA 2017-05-01 2017-05-01 40 1 40 – yAshu

+0

@yAshu - なぜ「ヌル」の時間(何か)はゼロに等しく、「ヌル」にはなりませんか?それ以外にも、私はすでに答えました。「表Aの各行に1行が必要な場合は、一番外側のクエリからWHERE句を削除してください。あなたはそれを見つけることができますか?それは私の答えの2番目の段落です!今度は、 'net_qty'に' NULL'の代わりにゼロを表示する必要がある場合は、外側のクエリの 'SELECT'で単に' qty * pct'の代わりに 'coalesce(qty、0)* pct as net_qty'を選択してください。あなたが 'pct'(Bの最初の行)を持っていなければ、' net_qty'はまだ 'null'でしょうか? – mathguy

+0

私は同じ論理を分析関数LAST VALUEを使用して私のクエリで使用しました....私はこのクエリの別の代替ソリューションが存在するかどうかを知るためにここに来ました...しかし、あなたはほぼ同じソリューションを書いています...ありがとう@mathguy。名誉! – yAshu

関連する問題