集計を行う場合、グループキーも同時に取り出すのが一般的です。リターン式には、集合関数指定と、ソート式で指定したキー指定が指定できます。各リターン項目は“,”で区切ります。複数のリターン項目を指定した場合は、結果として返す各リターン項目の値が区切り文字で区切られます。
Java APIを使用する場合は、“,”で区切られます
C APIを使用する場合は、文字コード'\001'の文字で区切られます
例として、検索式により以下の6件のXML文書がヒットしたものとして説明します。
文書A
<doc> : <basic date="2006年11月3日" expense="15500円"> : </basic> <detail> <destination area="神奈川県横浜市港北区">本社</destination> : <train>8600円</train><taxi></taxi><hotel>6900円</hotel> : </detail> : </doc>
文書B
<doc> : <basic date="2006年10月11日" expense="1000円"> : </basic> <detail> <destination area="神奈川県横浜市港北区">本社</destination> : <train>900円</train><taxi></taxi><hotel></hotel> : </detail> : </doc>
文書C
<doc> : <basic date="2006年11月25日" expense="21000円"> : </basic> <detail> <destination area="神奈川県横浜市港北区">本社</destination> : <train>13000円</train><taxi></taxi><hotel>8000円</hotel> : </detail> : </doc>
文書D
<doc> : <basic date="2006年9月29日" expense="4200円"> : </basic> <detail> <destination area="東京都千代田区">東京営業所</destination> : <train>1600円</train><taxi>600円</taxi><hotel></hotel> : </detail> : </doc>
文書E
<doc> : <basic date="2006年11月12日" expense="1300円"> : </basic> <detail> <destination area="東京都千代田区">東京営業所</destination> : <train>400円</train><taxi>900円</taxi><hotel></hotel> : </detail> : </doc>
文書F
<doc> : <basic date="2006年10月30日" expense="9500円"> : </basic> <detail> <destination area="東京都千代田区">東京営業所</destination> : <train>280円</train><taxi>680円</taxi><hotel>8500円</hotel> : </detail> : </doc>
以降の例の共通事項として、次のソート式が指定されているものとします。
ソート式 : /doc/detail/destination/@area
参考
集計を行う場合のソート式は、グループ化するキーを指定しますが、指定したキーでソートも行います。集計のためのソート式にも、“DESC”が指定できます。“DESC”を指定すると、グループ化キーの大きいものから集計結果を取り出すことができます。
注意
以下は、文字コード“UTF-8”を使用した場合の結果例です。
交通費(train)の平均を求めます。
リターン式 : /doc/detail/destination/@area,avg(/doc/detail/train/text())
結果:Java APIの場合
神奈川県横浜市港北区,7500 東京都千代田区,760
タクシーの利用者数を数えます。
リターン式 :/doc/detail/destination/@area,count(/doc/detail/taxi/text())
結果:Java APIの場合
神奈川県横浜市港北区,0 東京都千代田区,3
参考
集合関数の引数となるテキスト式が示す値がない場合は、集計の対象に含めません。上記の例では、本社に出張した人は誰もタクシーを利用していません。このため、countの結果は0になります。
taxi要素ノードに“0”という値を格納している場合は、集計の対象になります。このようなデータを格納している場合は、検索式にタクシー料金が0より大きいという条件を指定して、検索の対象から除外することで集計の対象から除外できます。
タクシー料金(taxi)の最大値と宿泊費(hotel)の合計、および出張回数を求めます。
リターン式 : /doc/detail/destination/@area,max(/doc/detail/taxi/text()),sum(/doc/detail/hotel/text()),count(/doc/detail/destination/text())
結果:Java APIの場合
神奈川県横浜市港北区,,14900,3 東京都千代田区,900,8500,3
ポイント
集合関数の引数となるテキスト式が示す値がない場合は、集計の対象に含めません。上記の例では、本社に出張した人は誰もタクシーを利用していません。このため、最大の値がありません。