【问题标题】:Conditional Distinct Count in Crystal ReportsCrystal Reports 中的条件非重复计数
【发布时间】:2013-02-09 03:39:04
【问题描述】:

我有一个这样的数据集:

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%

注意在第 1 类组中,有 3 条记录转换为 = 1,但由于 PersonID 重复,“X”(分子)等于 2。如何在 Crystal Reports 中计算?

【问题讨论】:

  • 如果第 5 行中 ClassID 的值为“1”,则分组错误。我希望它应该是“2”!
  • 好收获。我已经更新了源数据。谢谢

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


【解决方案1】:

this site 的帮助下,我不得不创建一些不同的公式来完成这项工作。

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

fTrial 参加:

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

【讨论】:

  • +1 以获得非常详细的解决方案!感谢您为我节省了数小时的头痛
  • @MPaul 这是一个非常具体的问题。我很高兴还有其他人可以提供帮助!
  • 非常感谢这个解决方案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多