この問題は、次の手順に従ってプログラミングせずに解決できます。
- カテゴリフィールドとユーザーフィールドでデータを並べ替えます( jdbc データソースを扱う場合は、iReportを使用して並べ替えを追加するか、クエリにORDER BY句を追加します)。
- 2 つのグループを追加します: 1 番目のグループ -カテゴリフィールド用と 2 番目のグループ -ユーザーフィールド用 ( iReport経由)。注:クエリに必ずGROUP BY句を追加する必要はありません。
- カテゴリフィールドのグループ ヘッダーバンドに円グラフコンポーネントを追加します。
- このpieChartのEvaluationTimeおよびEvaluationGroup プロパティを設定します。
Pie Chartの作成方法を示すための作業サンプルを次に示します。このサンプルでは、csvファイルをデータソースとして使用しました。
グラフには、各カテゴリのユーザー数が表示されます。各グループのユーザー数をカウントするために変数usersCountを使用しましたが、組み込み変数を使用することは可能でした。$V{userGroup_COUNT}
ここに私のjrxmlファイルがあります:
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport ...>
<field name="category" class="java.lang.Integer"/>
<field name="user" class="java.lang.String"/>
<field name="status" class="java.lang.String"/>
<sortField name="category"/>
<sortField name="user"/>
<variable name="usersCount" class="java.lang.Integer" resetType="Group" resetGroup="userGroup" calculation="Count">
<variableExpression><![CDATA[$F{user}]]></variableExpression>
<initialValueExpression><![CDATA[0]]></initialValueExpression>
</variable>
<group name="categoryGroup">
<groupExpression><![CDATA[$F{category}]]></groupExpression>
<groupHeader>
<band height="135">
<pieChart>
<chart evaluationTime="Group" evaluationGroup="categoryGroup">
<reportElement x="158" y="0" width="200" height="135"/>
<chartTitle/>
<chartSubtitle/>
<chartLegend/>
</chart>
<pieDataset>
<dataset resetType="Group" resetGroup="categoryGroup" incrementType="Group" incrementGroup="userGroup"/>
<keyExpression><![CDATA[$F{user}]]></keyExpression>
<valueExpression><![CDATA[$V{usersCount}]]></valueExpression>
<labelExpression><![CDATA[String.valueOf($V{usersCount})]]></labelExpression>
</pieDataset>
<piePlot>
<plot/>
<itemLabel/>
</piePlot>
</pieChart>
<textField>
<reportElement x="0" y="0" width="100" height="20"/>
<textElement/>
<textFieldExpression><![CDATA["Category: " + $F{category}]]></textFieldExpression>
</textField>
</band>
</groupHeader>
</group>
<group name="userGroup">
<groupExpression><![CDATA[$F{user}]]></groupExpression>
</group>
<title>
<band height="79" splitType="Stretch"/>
</title>
</jasperReport>
これが私のcsvファイルです(データファイル - datasource):
category,user,status
1,user1,WORK
1,user1,HOLIDAY
1,user2,SICK
2,user1,WORK
2,user2,WORK
2,user2,HOLIDAY
2,user3,HOLIDAY
2,user4,SICK
3,user1,HOLIDAY
3,user3,HOLIDAY
3,user5,HOLIDAY
4,user1,WORK
4,user1,HOLIDAY
4,user2,SICK
4,user2,WORK
4,user2,SICK
4,user3,HOLIDAY
4,user4,HOLIDAY
4,user5,HOLIDAY
結果は次のようになります ( iReportプレビュー経由):