在计算Cognos中的记录时,全外连接会产生笛卡尔积

时间:2015-07-18 02:46:49

标签: cognos cartesian-product full-outer-join

在列#34; id"上的2个表A和B上进行完全外连接在Cognos report studio中。两个表都有id列的多个记录。我的要求是我必须计算每个表中的记录数并将其显示在图表上。但是当我计算记录时,它会使记录倍增并产生笛卡尔积。

A.id ----   B.id  
1 ------ 1  
2 ------ 2  
2 ------ 2  
3 ------ 4  
4 ------ 5  
5 ------ 6

当我计算时,这就是我得到的:

A.id ----   B.id ----  Count(A.id)----   Count(B.id)  
1  ----     1   ----     1    ----       1  
2 ----      2  ----      4  ----         4    (Am expecting 2 for these kind of records)  
3  ----      null ---- 1 ---- null  
4 ----      4 ----       1----           1          
5 ----      5  ----      1 ----          1   
null ----        6 ----  null  ----               1  

我需要在图表中显示表A和表B中的记录总数。由于这会产生交叉产品,因此图表值无法给出正确的结果。任何人都可以建议如何避免这个笛卡尔积的第二个记录?如果可能,请建议吗?

2 个答案:

答案 0 :(得分:0)

如果必须单独显示计数,则使用两个表的联合并分别计算ID。

答案 1 :(得分:0)

由于您要加入非唯一列,因此您最终会在左侧与特定值的每个实例匹配,并与右侧的该值的每个实例相匹配。

想象一下,如果表A看起来像这样:

enter image description here

......而且表B看起来像这样:

enter image description here

ID上两个表的完全外连接将导致:

enter image description here

必须表示所有组合。这就是为什么你的计数每个计数显示4。在自动分组和汇总之前会产生四行。

添加到从连接派生的查询中的聚合只能在连接发生后在结果行上计算。在某种程度上,各个查询的详细信息会被模糊,因此无法计算等等。

如果你在这样的连接上生成SQL,你会经常看到Cognos已经这样做了:

SELECT a.column1, a.column2, b.column1. b.column2 
FROM (
    SELECT column1, column2 
    FROM tableA
    ) a FULL OUTER JOIN
    (
    SELECT column1, column2
    FROM tableB
    ) b ON a.column1 = b.column1

更高级别查询中的计数将添加到外部选择,但外部选择无法知道有多少行来自A,有多少来自B.它只能计算结果的结果行数

我能想到的唯一解决方案是在单个查询级别进行计数,然后将它们提取到连接的查询中。