1

以下查询:

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 查询工具输出

2019年1期余额行中gl账户5050的内容为一行,有一定金额(不等于0)。

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

我似乎无法找到为什么行没有通过完整的外部连接和合并合并在一起。

我究竟做错了什么?

4

1 回答 1

1

您正在使用 6 个维度的连接。这些维度中的每一个都是余额和预算的主键的一部分。但是,其中一些维度可以包含空值。Null 是 SQL 逻辑的特殊之处,它定义了一个未知类型的未知值(可以有各种类型的未知值)。SQL 使用三值逻辑(Brouwer 先生打招呼)。查看查询的输出

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

它清楚地表明 null=null 评估为“灰色”,这意味着 null:未知是真还是假:

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 
       )
于 2019-03-19T09:52:03.193 回答