この記事で分かること
- SQLで特定の列をキーにデータを集計する「GROUP BY」句の基本
- 合計(Sum)や平均(Avg)などの集計関数と、結果の列名を指定する「AS」を紹介
- 集計結果からさらに条件で絞り込む「HAVING」句の活用法
今回掲載の内容
- SQLで集計を行うには?
- 「GROUP BY」句の制約
- 列名の指定「AS」
- 特定の集計行のみの表示
SQLで集計を行うには?
今回は、SQL文での集計の方法(GROUP BY)を説明します。前回までに説明した「SELECT」文では、データを取得し表示させた場合、表示されるデータは元のデータの一部、もしくはすべてでした。今回使用する「GROUP BY」句を使用すると、特定の列をキーにした合計値や平均値などが表示される結果となります。まずは、例1のSQL文を実行してみましょう。前回説明したとおり、「Order Details」テーブルの指定に " "( ダブル・クオーテーション)を使用していますので、注意してくださいね。
【例1】
SELECT * FROM "Order Details"
今回使用する「Order Details」テーブルの内容が表示されます。このテーブルは、ある注文(OrderID)に対して、どの製品(ProductID)を、単価いくらで(UnitPrice)、いくつ(Quantity)受注したかを記録しています。
では、このテーブルを使用して、製品ごとにいくつ注文があったか、合計を計算してみましょう。
【例2】
SELECT ProductID, Sum(Quantity) FROM "Order Details" GROUP BY ProductID
この例2のように、「GROUP BY」というキーワードに続けて、集計のキーとなる列名を指定します。この例では、「製品ごとにいくつ注文があったか」ということでしたので、集計のキーは「製品」、すなわち、「ProductID」となります。
次に、「SELECT」句の中にある、「Sum(Quantity)」という部分を見てみましょう。これは、Quantity列の合計を求める集計関数です。集計関数には、Sumのほかに次のような関数があります。
例2の「SELECT」句には、複数の集計関数を指定することも可能です。
【例3】
SELECT ProductID, Avg(UnitPrice), Sum(Quantity) FROM "Order Details" GROUP BY ProductID
「GROUP BY」句の制約
「SELECT」句には、GROUP BYで指定した列と集計関数のみを指定することができます。例えば、例4のようなSQL文はエラーとなります。
【例4】
SELECT ProductID, UnitPrice, Sum(Quantity) FROM "Order Details" GROUP BY ProductID
もし、強制的にUnitPriceを表示したい場合は、UnitPriceをGROUP BYに追加します。
【例5】
SELECT ProductID, UnitPrice, Sum(Quantity) FROM "Order Details" GROUP BY ProductID, UnitPrice
ただし、この例5では同じProductIDを持つ製品でも違うUnitPriceを持つ行が存在する場合、1つの製品が複数の行に分かれてしまい、意図した結果は得られません。また、すべての行を集計の対象としたい場合は、次の例6のように、GROUP BYの指定を省きます。ただしこの場合は、上記のルールのとおり、SELECT句には集計関数しか指定することはできませんので、注意が必要です。
【例6】
SELECT Sum(Quantity) FROM "Order Details"
列名の指定「AS」
集計関数を使うと、結果の表示の際に「列名」が表示されないことに気が付きましたか? 次の例7のように「AS」句を使用することで、列名の指定をすることが可能です。
【例7】
SELECT ProductID AS "製品ID", Sum(Quantity) AS "個数合計" FROM "Order Details" GROUP BY ProductID
特定の集計行のみの表示
SELECT文に抽出条件を指定する場合は「WHERE」句を使用しました。上記の例7のようなGROUP BYによる集計行に対して抽出条件を指定する場合は、「HAVING」句を使用します。例えば、個数の合計が100個以上の製品のみを表示させる場合は、次のようなSQL文を実行します。
【例8】
SELECT ProductID AS "製品ID", Sum(Quantity) AS "個数合計" FROM "Order Details" GROUP BY ProductID HAVING Sum(Quantity) >= 100
上記の例8のように、「HAVING」に続けて抽出条件を指定します。WHERE句との違いは、集計関数が使用できることです。HAVING句で抽出条件に指定する集計関数には、SELECT句の中で指定されていない集計関数も指定することができます。
【例9】
SELECT ProductID AS "製品ID", Sum(Quantity) AS "個数合計" FROM "Order Details" GROUP BY ProductID HAVING Count(ProductID) >= 5
この例9では、各製品で5回以上注文された製品のみが、結果として表示されます。
今回のまとめ
今回は、 「GROUP BY」句、「HAVING」句を紹介しました。次回は、テーブルの結合の仕方(JOIN)を予定しています
- SQL Serverで「デッドロック」を回避する
- トランザクションの一貫性を保証するロック
- トランザクションを用いて注文登録をする
- トランザクションでデータの不整合を防ぐ
- テーブルで複数の処理を実行させるトリガー
- ユーザー定義関数を作成するストアドファンクション
- ストアドプロシージャによる繰り返し処理
- 条件分岐のあるストアドプロシージャ
- ストアドプロシージャの作成
- システム・ストアドプロシージャを用いたロールの詳細設定
- ロールを利用したグループ単位での権限設定
- SQL Serverのオブジェクトに権限を設定する
- Enterprise Managerによるビューの作成
- 作成したSELECT文をDBに登録する「ビュー」
- データの更新と主キーの重要性
- テーブル中のデータ識別に必要な主キーを定義する
- データの登録を行うINSERT文
- CREATE文をさらに使いこなそう
- CREATE文でテーブルを作成する
- SELECT文を統合する「UNION」
- サブクエリーの応用「相関サブクエリー」
- SELECT文の結果を抽出条件に使う
- テーブル結合のバリエーションを増やす
- テーブル結合の仕組みを理解する
- 異なるテーブル同士を結合する「JOIN」句
- 集計を行う「GROUP BY」句
- SELECT文で並べ替えを行うには?
- SQLの基礎 「SELECT」文を覚えよう
Copyright © ITmedia, Inc. All Rights Reserved.