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