Cognos / Framework Manager:双重计数

时间:2014-11-12 19:11:13

标签: modeling cognos

我有查询主题,案例和人。如果案例ID出现在人员记录中,则某人属于案例。我试图按案例ID计算人数而不计算重数。

人 字段:personID(PK),caseID(FK)

案例 字段:caseID(PK)

我可以在Case中创建一个看起来像这样的查询项: count([Case.caseID]的[Person]。[personID])

当我测试它时,我看到我的计数和caseID对案例中的每个人都出现一次。如果三个人在案件上,我会得到相应的caseID和三次“3”。

2 个答案:

答案 0 :(得分:1)

试试count(distinct [Person].[personID] for [Case.caseID] )。您也可以使用count(distinct [Person].[personID]),具体取决于您的列表配置方式。


好的,试试吧。它听起来越来越像显示问题而不是查询问题。

我假设您使用的是Cognos BI 8.3,8.4,10.1或10.2。我还假设你使用的是Report Studio而不是Query Studio。我已经习惯了8.4.1,但这些都与我所说的完全相似。如果您使用的是Cognos Insight,那么我们根本就不会进行通信。我翻译了一些报告,但就是这样。

使用新查询制作新的列表报告。第二次添加三个数据项:CaseIDPersonIDPersonID(我将其称为PersonID1,因为这就是Cognos可能会称之为的内容)。现在只需从Person表中添加它们,不要修改数据项以添加count()函数。

现在,将此查询作为列表添加到报表中并运行它。您应该看到一个非常基本的列表,它与SQL中的一个非常简单的查询相匹配。

返回查询,并将PersonID1的数据项修改为count (distinct [PersonID] for [CaseID])

返回第1页上的列表。这一次,按CaseID对列表进行分组。 (点击列表中的CaseID(不是列表标题),然后点击结构 - >组)。现在,当您运行报表时,您应该会看到CaseID字段将跨越有意义的多行,但PersonIDPersonID1字段不会。

这就是我假设你看到的。我假设你不喜欢PersonID1一遍又一遍地重复。

现在,真正容易的事就是说,“哦,我会按PersonID1分组,这样可行!”好吧,不,那不是你想要做的。它可能会起作用,但它不会可靠地工作。相反,再次返回到Page1,然后单击PersonID1数据项(而不是列表标题)。查看此项目的属性窗口。在“数据”下,您应该看到“组跨度”。单击该按钮,然后将下拉菜单设置为唯一可用的组CaseID。现在,当您运行报表时,您应该获得一个包含跨越行的单元格的项目。

这就是你要找的东西,还是我现在太简单了?

对于更复杂的报告,您需要更多地控制分组和排序,控制两者的顺序。您可以通过单击列表,然后转到数据 - >返回到它。高级排序。您可以在此处指定数据的分组和排序方式,并根据需要进行更正或调整。

答案 1 :(得分:0)

COGNOS'默认行为是仅显示具有不同属性值组合的行并聚合任何度量值。如果我的数据如此:

PersonID |人|销售
1 |鲍勃| 100个
2 |弗兰克| 600个
1 |鲍勃| 300个

Cognos将找到非度量列的所有不同组合,在我们的示例中为PersonID和Person,并且只显示一次。任何措施都将汇总到这些组合。运行查询的结果应为:

1 |鲍勃| 400个
2 |弗兰克| 600个

如果度量列的聚合函数属性为'总计'则会发生这种情况。这是大多数措施的情况。此行为称为' Auto-Group&总结&#39 ;.默认情况下,它已启用查询。

在您的情况下,您正在创建自定义聚合函数。自定义聚合函数的聚合函数属性应为'计算'。这告诉Cognos在创建自己的自定义聚合函数时不要尝试汇总列值。在您的count()函数中,您有[案例]。[caseID]'。这告诉Cognos将值汇总到您指定的级别,而不是通过查看非度量列中的唯一属性组合确定的默认级别。因此,对于每个caseID,计数列只出现一次且仅出现一次的唯一方法是仅包含caseID或列列表中同一粒度的任何列。如果您包含粒度低于caseID的任何列,Cognos将进一步将每个caseID值分成多行,每行都有一些变化的列。这将导致您的聚合列重复。如果您正在查看的是在Framework Manager中生成的示例数据,这可能是不可避免的,因为具有两个具有1-n关系的源的查询主题必定具有来自1和n侧的属性项。