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 には、Converted = 1 の 3 つのレコードがありますが、PersonID が重複しているため、'X' (分子) は 2 に等しいことに注意してください。Crystal Reports でこれを計算するにはどうすればよいですか?

4

1 に答える 1

2

このサイトの助けを借りてこれを機能させるには、いくつかの異なる数式を作成する必要がありました。

まず、そのサイトで提案されているように、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}

出席または変換が true の場合、PersonID を返すことに注意してください。これにより、次の式で個別のカウントを行うことができます (元の質問の X):

FX:

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

これは、グループ フッターに配置されます。@fTrialsConverted は、変換された試行の PersonID (またはカウントされない fNull) を返すことを思い出してください。私が理解していないことの 1 つは、グループ フッターにある場合、フィールドごとのグループ (ClassID) を明示的に含める必要があった理由ですが、そうしないと、すべてのグループの合計がカウントされます。次に、Y は単純なカウントです。

年度:

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

そして最後に、パーセンテージを計算する式:

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

最後にお伝えするのは、レポート フッターのすべてのグループの合計も計算したかったということです。Y の合計を数えるのは簡単でした。group by パラメータを省略したことを除けば、fY 式と同じです。各グループの X の合計が必要で、Crystal が別の合計を合計できないため、X の合計を数えるのが面倒でした。そこで、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 を使用できるようになりました。これは、理解するのに数時間かかったもう1つの当惑することにつながりました. global キーワードを明示的に追加するまで、rtConverted はグローバル変数として扱われませんでした。これまでに見たすべてのドキュメントで、global がデフォルトであると書かれていました。私がそれを理解したら、それはすべてうまくいきました。

于 2013-02-14T21:09:16.167 に答える