1

我正在 Cognos 报告工作室的“id”列上的 2 个表 A 和 B 上进行完全外部联接。两个表都有 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 中的记录总数。由于这会导致叉积,因此图形值没有给出正确的结果。任何人都可以建议如何在第二条记录中避免这种笛卡尔积吗?请建议这是否可能?

4

2 回答 2

0

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

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

在此处输入图像描述

...和表 B 看起来像这样:

在此处输入图像描述

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

在此处输入图像描述

必须表示所有组合。这就是为什么每次计数显示 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。它只能计算连接的结果行。

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

于 2015-10-06T17:38:31.380 回答
0

如果您必须单独显示计数,则使用两个表的 Union 并分别计数 id。

于 2015-10-04T09:24:33.363 回答