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

我试图在单个 Invoice_Id(K = Parent,C = Child)中从 Kit_Flag 为“K”的最后一行获取后续行的 Part_Number 值。为简单起见,我在此处仅列出了一个发票 ID。

因此,对于上面的数据,结果将如下所示:

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)" 之类的方式实现,这实际上是我们暂时必须解决的问题,但我正在尝试将其自动化。

该表在 Oracle 9i 和 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

一种方法是使用嵌套排名函数。首先,为所有获得一个值的事物分配一个常量值(使用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 回答