# CHAPTER 11: GROUP BY句

`SELECT`コマンドで要求するレコードは、共通するフィールド値で グループ化できます。この処理は`GROUP BY`句を指定して実行します。 `GROUP BY`句には、フィールド名を指定し、出力はグループ化された フィールドによってソートされます。

`GROUP BY`句に、複数フィールドを指定してグループ化の処理をネストでき ます。最初のグループ化は、最初に指定したフィールドによって行なわれます。 その後2番目に指定したフィールドでグループ化します。この処理は指定された フィールド数回行なわれます。

`GROUP BY`句は、集計関数（COUNT、MAX、AVGなど）と併用する場合が多く なります。集計関数は全レコードではなく、特定のグループにに適用できます。 グループに関数を適用すると、検索データを表示するフォーマットを変更できます。 関数の処理結果（例4)は、グループで表示されます。表示フォーマットの 規定値（カラム幅と精度）には適用されません。 それは、表示される値に対して適用されるからです。

例

1. `loans`テーブルの、`name`フィールドでグループ化します。

          SELECT name, date, amount FROM loans GROUP BY name;

   以下を表示します。

          name          date                 amount

          Jones          7 February 1990      $33.95
                         3 April 1990         $25.00
                        12 August 1990       $300.00
          Kilroy        16 February 1990     $250.00
          Mosca          2 February 1990     $150.00
                         4 May 1990          $200.00
          Peterson       6 June 1990          $50.00
          Scarlatti      9 September 1990    $150.00
                        14 October 1990      $125.00
          Wladislaw     27 February 1990      $55.00
                        12 May 1990           $55.00
                        25 June 1990          $75.00

   `name`フィールドでソートされていることに、注意してください。 またグループ内で重複されている`name`フィールド値は、省略されています。 重複名を表示したい場合には、システム変数`MSQLSELKEEPDUPLICAATE`をセット してください。

2. Jonesの3番目のデータを更新します。

          UPDATE loans SET amount = 25
             WHERE name = "Jones" AND amount = 300;

   以下のコマンドで検索します。

          SELECT name, date, amount FROM loans
             GROUP BY name, amount;

   以下のような表示が行なわれます。

          name          date                amount

          Jones          3 April 1990        $25.00
                        12 August 1990
                         7 February 1990     $33.95
          Kilroy        16 February 1990    $250.00
          Mosca          2 February 1990    $150.00
                         4 May 1990         $200.00
          Peterson       6 June 1990         $50.00
          Scarlatti     14 October 1990     $125.00
                         9 September 1990   $150.00
          Wladislaw     27 February 1990     $55.00
                        12 May 1990
                        25 June 1990         $75.00

   `name`フィールドと、`amount`フィールドでソートされていること に注意してください。

3. `COUNT`関数を使用して、グループ内のレコードをカウントできます。 `name`フィールドでグループ化してレコードをカウントするには、以下の コマンドを実行します。

          SELECT name, COUNT FROM loans GROUP BY name;

   以下の表示を行います。

          name          COUNT(*)

          Jones         3
          Kilroy        1
          Mosca         2
          Peterson      1
          Scarlatti     2
          Wladislaw     3

   `COUNT`関数の表示結果は、`name`フィールド検索結果の横に表示 されます。

4. `GROUP BY`に指定していないフィールドに、`COUNT`関数を使用 した場合、この関数の処理結果はカラムではなく、各グループの下に出力されます。

          SELECT name, amount, COUNT FROM loans GROUP BY name;

   以下を表示します。

          name          amount

          Jones          $33.95
                         $25.00
                        $300.00

          COUNT(*) = 3

          Kilroy        $250.00

          COUNT(*) = 1

          Mosca         $150.00
                        $200.00

          COUNT(*) = 2

          Peterson       $50.00

          COUNT(*) = 1

          Scarlatti     $150.00
                        $125.00

          COUNT (*) = 2

          Wladislaw      $55.00
                         $25.00
                         $75.00

          COUNT(*) = 3

5. 集計関数を使用して、グループ内での合計、平均、最大値、最小値を表示でき ます。`name`フィールドでグループ化して、各グループの合計を表示します。

          SELECT name, SUM (amount) FROM loans GROUP BY name;

   以下のように表示されます。

          name          SUM (amount)

          Jones          358.95
          Kilroy         250.00
          Mosca          150.00
          Peterson        50.00
          Scarlatti      275.00
          Wladislaw      155.00

   関数名は、フィールド名の横に表示されます。また関数の処理結果は、フィールド値の横のカラムに表示されます。

6. `GROUP BY`句に、指定されていないフィールドと共に、集計関数を使用 した場合には、関数の処理結果はカラムではなく、各グループの下に出力されます。

          SELECT name, amount, SUM (amount) FROM loans
             GROUP BY name;

   以下のように表示されます。

          name           amount

          Jones           $33.95
                          $25.00
                         $300.00

          SUM(amount) =      358.95

          Kilroy         $250.00

          SUM(amount) =      250.00

          Mosca          $150.00
                         $200.00

          SUM(amount) =      350.00

          Peterson        $50.00

          SUM(amount) =       50.00

          Scarlatti      $150.00
                         $125.00

          SUM(amount) =      275.00

          Wladislaw       $55.00
                          $25.00
                          $75.00

          SUM(amount) =      155.00