我有查询主题,案例和人。如果案例ID出现在人员记录中,则某人属于案例。我试图按案例ID计算人数而不计算重数。
人 字段:personID(PK),caseID(FK)
案例 字段:caseID(PK)
我可以在Case中创建一个看起来像这样的查询项: count([Case.caseID]的[Person]。[personID])
当我测试它时,我看到我的计数和caseID对案例中的每个人都出现一次。如果三个人在案件上,我会得到相应的caseID和三次“3”。
答案 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,那么我们根本就不会进行通信。我翻译了一些报告,但就是这样。
使用新查询制作新的列表报告。第二次添加三个数据项:CaseID
,PersonID
和PersonID
(我将其称为PersonID1
,因为这就是Cognos可能会称之为的内容)。现在只需从Person表中添加它们,不要修改数据项以添加count()
函数。
现在,将此查询作为列表添加到报表中并运行它。您应该看到一个非常基本的列表,它与SQL中的一个非常简单的查询相匹配。
返回查询,并将PersonID1
的数据项修改为count (distinct [PersonID] for [CaseID])
。
返回第1页上的列表。这一次,按CaseID
对列表进行分组。 (点击列表中的CaseID
(不是列表标题),然后点击结构 - >组)。现在,当您运行报表时,您应该会看到CaseID
字段将跨越有意义的多行,但PersonID
和PersonID1
字段不会。
这就是我假设你看到的。我假设你不喜欢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侧的属性项。