2

次のように整理されたデータがあります。

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

アドバイスやガイダンスは大歓迎です。

4

1 に答える 1

3

これを行う1つの方法は、ネストされたランキング関数を使用することです。まず、(を使用して)1つの値を取得するすべてのものに定数値を割り当て、max() over次にこれをパーティションとして使用します。

select t.Invoice_Id, t.Invoice_Line, t.Kit_Flag, t.Part_Number,
       max(KitPart) over (partition by invoice_id, KitNum) as Parent_Part
from (select t.*,
             sum(isKit) over (partition by InvoiceId order by InvoiceLine) as KitNum
      from (select t.Invoice_Id, t.Invoice_Line, t.Kit_Flag, t.Part_Number,
                   (case when Kit_Flag = 'K' then 1 else 0 end) as IsKit,
                   (case when Kit_Flag = 'K' then Part_Number end) as KitPart
            from Invoice_Data t
           ) t
     ) t
于 2012-12-12T21:52:22.827 に答える