Crystal Reports中的条件不同计数

时间:2013-02-09 03:39:04

标签: crystal-reports formula crystal-reports-2010 summary

我有这样的数据集:

ID    PersonID    ClassID    Attended    Converted
1     1           1          1           0
2     1           1          1           1
3     1           1          1           1
4     2           1          1           1
5     3           2          0           0
6     3           2          1           1
7     4           2          1           0

我正在构建一个按ClassID分组的报告(实际上我使用的参数允许在几个不同的cols上进行分组,但为了简单起见,我只是使用ClassID)。我需要在每个组页脚中进行计算。为了进行计算,我需要计算具有该组唯一的PersonID的记录。在一种情况下,这些记录也需要符合标准。 EG:

X = [Count of records where Converted = 1 with distinct PersonID]
Y = [Count of records where Attended = 1]

然后我需要以百分比显示商:

(X/Y)*100

所以最终报告看起来像这样:

ID    PersonID    Attended    Converted
CLASS 1 GROUP
1     1           1           0
2     1           1           1
3     1           1           1
4     2           1           1

Percent= 2/4 = 50%

CLASS 2 GROUP
5     3           0           0
6     3           1           1
7     4           1           0

Percent= 1/2 = 50%

注意在Class 1 Group中,有3条记录的Converted = 1,但由于PersonID重复,'X'(分子)等于2。如何在Crystal Reports中计算出来?

1 个答案:

答案 0 :(得分:1)

我必须在this site的帮助下创建一些不同的公式才能使其工作。

首先我按照该网站的建议创建了一个名为fNull的函数,它只是空白。我想知道如果只是在它的位置键入null将完成这项工作,但没有进行测试。接下来,我创建了公式来评估是否有人参加了一行以及是否转换了一行。

fTrialAttended:

//Allows row to be counted if AttendedTrial is true
if {ConversionData.AttendedTrial} = true
then CStr({ConversionData.PersonID})
else {@fNull}

fTrialsConverted:

//Allows row to be counted if Converted is true
if {ConversionData.Converted} = true
then CStr({ConversionData.PersonID})
else {@fNull}

请注意,如果出席或转换为真,我将返回PersonID。这让我可以在下一个公式(原始问题中的X)中进行不同的计数:

FX:

DistinctCount({@fTrialsConverted}, {ConversionData.ClassID})

这是放在组页脚中。再次记住@fTrialsConverted返回转换的试验的PersonID(或fNull,不计算)。我不明白的一件事是,为什么我必须明确地包括按字段分组(ClassID),​​如果它在组页脚中,但我做了或者它将计算所有组的总数。接下来,Y只是一个直接的计数。

FY:

//Counts the number of trials attended in the group
Count({@fTrialsAttended}, {ConversionData.ClassID})

最后计算百分比的公式:

if {@fY} = 0 then 0
else ({@fX}/{@fY})*100

我要分享的最后一件事是我还想计算报告页脚中所有组的总数。计算总Y很容易,它与fY公式相同,除了你通过参数省略组。计算总X是比较棘手的,因为我需要来自每个组的X的总和而Crystal不能求和另一个总和。所以我更新了我的X公式,以便在全局变量中保持运行总计:

FX:

//Counts the number of converted trials in the group, distinct to a personID
whileprintingrecords;

Local NumberVar numConverted := DistinctCount({@fTrialsConverted}, {@fGroupBy});

global NumberVar rtConverted := rtConverted + numConverted;    //Add to global running total

numConverted;   //Return this value

现在我可以在页脚中使用rtConverted进行计算。这导致了另外一件令人眼花缭乱的事情,花了我几个小时来弄明白。在我明确添加了global关键字之前,rtConverted没有被视为全局变量,尽管我看到所有文档都说global是默认的。一旦我弄明白,这一切都很有效。

相关问题