以下查询:
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行。这些行中的一行带有标签“预算”,而另一行则带有“平衡线”。
似乎它们在合并中没有以某种方式合并在一起:
2019年第1期余额行中的总帐科目5050的内容为一行且有一定金额(不等于0)。
2019年第1期间预算中的总帐科目5050的内容也是一行且有一定金额(不等于0)。
我似乎无法找到为什么行不能通过完整的外部联接和合并而合并在一起。
我在做什么错了?
答案 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,作为与成本中心和/或成本单位无关的财务金额。在这种情况下,余额行中的空值和预算中的空值具有相同的语义。
干净的方法是适应原始的加入条件:
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
)