2011/07/26

カウント (Count)

件数のカウントについて、代表的なものをまとめます。

【通常のカウント】
基本となる構文は以下の通りです。
<?count(JOB)?>

カウントする際にフィルタをかける場合は以下の様に記載します。この例ではカウント対象に含まれるNullを除外します。
<?count(JOB[. != ""])?>


【ループ内のカウント】
カウントがFORループの中にある場合、カレントグループのカウントを行います。
<?count(current-group()/JOB)?>

フィルタと組み合わせる場合は以下の通りです。
<?count(current-group()/JOB[. != ""])?>


【重複を除いたカウント】
重複を除いたカウントを行う際にはこちらを使用します。
<?count(xdoxslt:distinct_values(JOB)?>

ループ内の場合は、上述の構文と組み合わせて以下のようになります。
<?count(xdoxslt:distinct_values(current-group()/JOB))?>

なお、データソースがOracle DBの場合、SQLのCOUNT関数にdistinctを付加することで同様の結果を得ることもできます。
select count(distinct job) from emp;


【ページ毎のカウント】
add-page-total を使用することでページ毎のカウントを行うこともできます。
詳細は「ページ合計 (Page total)」を参照してください。




[Summary]
There are several ways to count your record with BI Publisher.


[Ordinary count]
The basic formula is:
<?count(JOB)?>


If you want conditional count, use filter. The example below skips null values.
<?count(JOB[. != ""])?>




[Count in a loop]
If you want to count records by group (in a for loop), put current-group().
<?count(current-group()/JOB)?>


With filter:
<?count(current-group()/JOB[. != ""])?>




[Distinct count]
To skip duplicated values, use count-distinct.
<?count(xdoxslt:distinct_values(JOB)?>


In a for loop:
<?count(xdoxslt:distinct_values(current-group()/JOB))?>


If your data source is oracle database, the following SQL may work.
select count(distinct job) from emp;




[Count by page]
With add-page-total, you can get page count.
Please refer the past post Page Total for more information.