この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
今回は、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
「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"
集計関数を使うと、結果の表示の際に「列名」が表示されないことに気が付きましたか? 次の例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)を予定しています
Copyright © ITmedia, Inc. All Rights Reserved.