集合関数はテーブル全体についての情報を提供するだけでなく、ローのグループについても使用できます。GROUP BY 句は、ローをグループ単位で配置し、集合関数はロー・グループごとに 1 つの値を返します。
Interactive SQL で次のクエリを実行します。
SELECT SalesRepresentative, COUNT( * ) FROM SalesOrders GROUP BY SalesRepresentative ORDER BY SalesRepresentative; |
SalesRepresentative | count(*) |
---|---|
129 | 57 |
195 | 50 |
299 | 114 |
467 | 56 |
... | ... |
GROUPBY 句は SQL Anywhere に対して、もしこれがなければ返されるすべてのローのセットを分割するように指示します。各分割、つまりグループに含まれるすべてのローは、指定のカラムに同じ値を持ちます。ユニークな値ごと、または値セットごとに、1 つだけグループがあります。この場合、各グループに含まれるすべてのローの SalesRepresentative 値が同じになります。
COUNT などの集合関数は、各グループのローに適用されます。したがって、この結果セットには各グループのローの合計数が表示されます。クエリの結果は、各営業担当者の ID 番号が入った 1 つのローで構成されています。各ローには、営業担当者 ID と、その担当者の受注の合計数が入ります。
GROUP BY を使用した場合には、結果テーブルには GROUP BY 句に指定したカラムまたはカラム・セットごとにローが 1 つずつあります。GROUP BY 句:クエリ結果のグループへの編成を参照してください。
GROUP BY 句を使用する場合の一般的なエラーは、1 つのグループにまとめることができない情報を得ようとすることです。たとえば、次のクエリではエラーが発生します。
SELECT SalesRepresentative, Surname, COUNT( * ) FROM SalesOrders KEY JOIN Employees GROUP BY SalesRepresentative; |
指定された ID を持つ従業員についての結果ローごとに、姓がすべて同じであることを SQL Anywhere は保証できないため、「'Surname' に対する関数またはカラムの参照も GROUP BY 句に記述する必要があります。
」というエラーがレポートされます。
このエラーを解決するには、GROUP BY 句にカラムを追加します。
SELECT SalesRepresentative, Surname, COUNT( * ) FROM SalesOrders KEY JOIN Employees GROUP BY SalesRepresentative, Surname ORDER BY SalesRepresentative; |
この方法が適切でない場合は、代わりに集合関数を使用して、値を 1 つだけ選択できます。
SELECT SalesRepresentative, MAX( Surname ), COUNT( * ) FROM SalesOrders KEY JOIN Employees GROUP BY SalesRepresentative ORDER BY SalesRepresentative; |
MAX 関数は、各グループのディテール・ローから最大 (アルファベット順の最後) の姓 (Surname) を選択します。最大値は 1 つしかないので、この文は有効です。この場合は、グループ内のすべてのディテール・ローに同じ姓が表示されます。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |