应计价值的Informatica场景

时间:2018-04-11 04:13:44

标签: oracle informatica

来源表:

header_id  line_id   account_type         accrual_tier
101          1         expense                            NULL
101          2         liability                               TAX
101.         3         Liability                              Tax
101         4.        Liability                               GYC 
102          1         liability                                C&B
102          2         expense                             NULL
102          3         expense                             NULL
102.         4       ASSET                                ABC 
102.         5        OWNERS                            PQR 
102.         6        liability                               C&B 
 102.         7       liability                               DET

预期输出 - 目标表:

header_id line_id  account_type   accrual_tier
101          1       expense          TAX     
101          2       liability             TAX
101          3      Liability            TAX 
101          4      liability             GYC 
102          1       liability             C&B
102          2       expense          C&B
102.         3       expense          C&B
102.         4       ASSET            ABC 
102.         5       OWNERS        PQR 
102.         6       liability            C&B 
102.         7       liability            DET 

每个标题都有多行,每行都是费用或责任或资产或所有者帐户类型。 accrual_tier包含除费用外的所有帐户的值。对于'expense',它为空。

要求是按相应的accrual_tier值填充所有类型的accrual_tier值。

除费用类型外 - 应计值将是具有责任类型的行的应计价值的最大值。

例如,对于标题101,该标题下的最大发生应计值为TAX,因此对于在该标题下具有费用类型的所有行将被指定为TAX。

2 个答案:

答案 0 :(得分:0)

您可以使用分析max()功能查找每个accrual_tier的责任记录header_id

select header_id
      , line_id
      , account_type
      , max(case when account_type = 'liability' then  accrual_tier end) 
                                over (partition by header_id) as accrual_tier
from source_table
order by header_id
      , line_id
/

或者我们可以使用FIRST_VALUE()函数来解决这个问题,这需要稍微减少输入:):

select header_id
      , line_id
      , account_type
      , first_value (accrual_tier ignore nulls) 
                          over (partition by header_id) as accrual_tier
from source_table
order by header_id
      , line_id
/

这是a LiveSQL demo (free Oracle TechNet account required)

请注意,这两种解决方案都依赖于源数据的关系完整性。如果标题有多行account_type='liability',那么您可能会遇到意外的替换。同样,如果有account_type='expense' and accrual_tier is not null两行都会覆盖原始值的行。

----------

您已修改了您的要求但未完成:您似乎是根据您未在问题中包含的某些条件确定费用accrual_tier的替代值。所以这可能不是您需要的解决方案,但在发布完整问题之前,这是我能做的最好的事情:

select header_id
      , line_id
      , account_type
      , case when accrual_tier != 'expense' then 
           accrual_tier 
        else
          last_value (accrual_tier ignore nulls) over (partition by header_id order by accrual_tier)
        end  as accrual_tier 
from source_table
order by header_id
      , line_id
/

您标记了问题[infomatica],但我无法访问该产品;我假设工作Oracle SQL将解决您的问题。

答案 1 :(得分:0)

1)按header_id排序数据,account_type按降序排序(以确保每个header_id的第一条记录是负债)

2)在表达中做以下事情:

  • I / p Port:Header_id
  • 变量端口temp = IIF(Header_id = V_Header_id或ISNULL(V_Header_id),IIF(account_type ='liablity',accrual_tier,NULL),NULL)
  • accrual_tier:IIF(Header_id = V_Header_id或ISNULL(V_Header_id)&& account_type ='expense',temp,NULL)
  • 变量端口V_Header_id = Header_id