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