1

我有一个这样的数据集:

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 分组的报告(实际上我正在使用一个允许对几个不同的列进行分组的参数,但为了简单起见,我只是使用 ClassID)。我需要在每个组页脚中进行计算。为了进行计算,我需要计算具有该组唯一的 PersonID 的记录。问题是,在一种情况下,这些记录还需要匹配一个标准。例如:

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 中进行计算?

4

1 回答 1

2

在这个网站的帮助下,我不得不创建一些不同的公式来完成这项工作。

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

f审判参加:

//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):

外汇:

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 公式,以便在全局变量中保持运行总计:

外汇:

//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 是默认值。一旦我弄清楚了,一切都很好。

于 2013-02-14T21:09:16.167 回答