预算和实际行未在完全外部联接上合并

时间:2019-03-19 09:40:01

标签: exact-online invantive-sql

以下查询:

select coalesce(to_number(bl.division_code), bud.division) division
,      coalesce(bud.glaccountcode, bl.costcenter_costanalysis_period_periods_year_years_balance_code_attr) glaccountcode
,      coalesce(bud.costcenter, bl.costcenter_code_attr) costcenter
,      coalesce(bud.costunit, bl.code_attr) costunit
,      coalesce(bud.reportingyear, bl.costcenter_costanalysis_period_periods_year_reportingyear_attr) reportingyear
,      coalesce(bud.reportingperiod, bl.costcenter_costanalysis_period_reportingperiod_attr) reportingperiod
,      case when bud.amountdc > 0 then 456 else null end budgetamountdc label 'Budget (anonymized, EUR)'
,      case when bl.balance > 0 then 123 else null end actualsamountdc label 'Actuals (anonymized, EUR)'
,      case
       when bl.division_code is null
       then 'budget'
       when bud.division is null
       then 'balancelines'
       else 'both'
       end
       label 'Source'
from   exactonlinexml..balancelinesperperiodcostanalysis bl
full
outer
join   exactonlinerest..budgets bud
on     bud.division        = to_number(bl.division_code)
and    bud.glaccountcode   = bl.costcenter_costanalysis_period_periods_year_years_balance_code_attr
and    bud.costcenter      = bl.costcenter_code_attr
and    bud.costunit        = bl.code_attr
and    bud.reportingyear   = bl.costcenter_costanalysis_period_periods_year_reportingyear_attr
and    bud.reportingperiod = bl.costcenter_costanalysis_period_reportingperiod_attr

将总账帐户上的实际交易与相关预算进行详细关联:

  • 确切的在线公司(division_code
  • 财政年度(reportingyear
  • 财务期(reportingperiod
  • 总帐帐户(glaccountcode
  • 成本中心(costcenter
  • 成本单位(costunit

我希望这些维度的组合最多包含一行数据。但是,对于某些组合,将返回2行。这些行中的一行带有标签“预算”,而另一行则带有“平衡线”。

似乎它们在合并中没有以某种方式合并在一起:

Invantive Query Tool output

2019年第1期余额行中的总帐科目5050的内容为一行且有一定金额(不等于0)。

2019年第1期间预算中的总帐科目5050的内容也是一行且有一定金额(不等于0)。

我似乎无法找到为什么行不能通过完整的外部联接和合并而合并在一起。

我在做什么错了?

1 个答案:

答案 0 :(得分:1)

您正在6个维度上使用联接。这些维度中的每一个都是余额和预算主键的一部分。但是,其中某些维可以包含空值。 Null是SQL逻辑的特殊特性,它定义了未知类型的未知值(可以有各种类型的未知值)。 SQL使用三值逻辑(Mr. Brouwer says hello)。查看查询结果

select 1=1 are_they_equal_bool1
,      1=0 are_they_equal_bool2
,      null=null are_they_equal_bool3

它清楚地表明null = null的计算结果为“灰色”,表示null:不知道是真还是假:

null=null has unknown (null) outcome

您需要补偿联接中的空值。在这种情况下,您可能会为成本中心和成本单位定义NULL,作为与成本中心和/或成本单位无关的财务金额。在这种情况下,余额行中的空值和预算中的空值具有相同的语义。

干净的方法是适应原始的加入条件:

and    bud.costcenter      = bl.costcenter_code_attr
and    bud.costunit        = bl.code_attr

在两列中都具有null意味着相同的含义:

and    ( ( bud.costcenter is null and bl.costcenter_code_attr is null )
         or 
         bud.costcenter      = bl.costcenter_code_attr 
       )
and    ( ( bud.costunit is null and bl.code_attr is null )
         or 
         bud.costunit      = bl.code_attr 
       )