Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - SQL の使用法 » データのクエリと変更 » データのクエリ » 集合関数

 

グループ分けされたデータに対する集合関数の適用

集合関数はテーブル全体についての情報を提供するだけでなく、ローのグループについても使用できます。GROUP BY 句は、ローをグループ単位で配置し、集合関数はロー・グループごとに 1 つの値を返します。

♦  営業担当者と各担当者が受注した件数をリストするには、次の手順に従います。

GROUPBY 句は SQL Anywhere に対して、もしこれがなければ返されるすべてのローのセットを分割するように指示します。各分割、つまりグループに含まれるすべてのローは、指定のカラムに同じ値を持ちます。ユニークな値ごと、または値セットごとに、1 つだけグループがあります。この場合、各グループに含まれるすべてのローの SalesRepresentative 値が同じになります。

COUNT などの集合関数は、各グループのローに適用されます。したがって、この結果セットには各グループのローの合計数が表示されます。クエリの結果は、各営業担当者の ID 番号が入った 1 つのローで構成されています。各ローには、営業担当者 ID と、その担当者の受注の合計数が入ります。

GROUP BY を使用した場合には、結果テーブルには GROUP BY 句に指定したカラムまたはカラム・セットごとにローが 1 つずつあります。GROUP BY 句:クエリ結果のグループへの編成を参照してください。

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 つしかないので、この文は有効です。この場合は、グループ内のすべてのディテール・ローに同じ姓が表示されます。