次のように整理されたデータがあります。
Invoice_Id Invoice_Line Kit_Flag Part_Number
---------- ------------ -------- -----------
AB12345 1 K KT-1234A
AB12345 2 C 1234567
AB12345 3 C 1234568
AB12345 4 C 1234569
AB12345 5 C 1234560
AB12345 6 K KT-1234C
AB12345 7 C 1234561
AB12345 8 C 1234562
AB12345 9 K KT-1234Q
AB12345 10 C 5678901
AB12345 11 C 1234561
AB12345 12 C 1234562
Kit_Flagが単一のInvoice_Id(K =親、C =子)内の「K」であった最後の行から後続の行のPart_Number値を取得しようとしています。わかりやすくするために、ここでは請求書IDを1つだけリストしました。
したがって、上記のデータの場合、結果は次のようになります。
Invoice_Id Invoice_Line Kit_Flag Part_Number Parent_Part
---------- ------------ -------- ----------- ------------
AB12345 1 K KT-1234A KT-1234A
AB12345 2 C 1234567 KT-1234A
AB12345 3 C 1234568 KT-1234A
AB12345 4 C 1234569 KT-1234A
AB12345 5 C 1234560 KT-1234A
AB12345 6 K KT-1234C KT-1234C
AB12345 7 C 1234561 KT-1234C
AB12345 8 C 1234562 KT-1234C
AB12345 9 K KT-1234Q KT-1234Q
AB12345 10 C 5678901 KT-1234Q
AB12345 11 C 1234561 KT-1234Q
AB12345 12 C 1234562 KT-1234Q
Excelでは、これは「= If(C2 = "K"、C3、D2)」のようなもので可能であり、それは実際には当面は解決しなければならなかったものですが、私はこれを自動化しようとしています。
この表はOracle9iとSybaseの両方にありますが、Sybaseインスタンスには分析機能がありません。
私はこれがうまくいくとは思いませんでした(そしてうまくいきませんでした)が、概念的には私がやろうとしていることを示しています:
select
t.Invoice_Id, t.Invoice_Line, t.Kit_Flag, t.Part_Number,
case
when Kit_Flag = 'K' then Part_Number
else lag(Parent_Part, 1) over (partition by Invoice_Id order by Invoice_Line)
end as Parent_Part
from Invoice_Data t
アドバイスやガイダンスは大歓迎です。