連載
» 2000年12月22日 00時00分 UPDATE

SQL実践講座(3):集計を行う「GROUP BY」句

[篠原光太郎,@IT]

今回掲載の内容

  • SQLで集計を行うには?
  • 「GROUP BY」句の制約
  • 列名の指定「AS」
  • 特定の集計行のみの表示


SQLで集計を行うには?

 今回は、SQL文での集計の方法(GROUP BY)を説明します。前回までに説明した「SELECT」文では、データを取得し表示させた場合、表示されるデータは元のデータの一部、もしくはすべてでした。今回使用する「GROUP BY」句を使用すると、特定の列をキーにした合計値や平均値などが表示される結果となります。まずは、例1のSQL文を実行してみましょう。前回説明したとおり、「Order Details」テーブルの指定に " "( ダブル・クオーテーション)を使用していますので、注意してくださいね。

【例1】

SELECT * FROM "Order Details"
画面1 OrderDetailsテーブルの内容(画面をクリックすると拡大表示します) 画面1 OrderDetailsテーブルの内容(画面をクリックすると拡大表示します)

 今回使用する「Order Details」テーブルの内容が表示されます。このテーブルは、ある注文(OrderID)に対して、どの製品(ProductID)を、単価いくらで(UnitPrice)、いくつ(Quantity)受注したかを記録しています。

 では、このテーブルを使用して、製品ごとにいくつ注文があったか、合計を計算してみましょう。

【例2】

SELECT ProductID, Sum(Quantity)
FROM "Order Details"
GROUP BY ProductID
画面2 製品ごとに個数の合計をとってみたところ(画面をクリックすると拡大表示します) 画面2 製品ごとに個数の合計をとってみたところ(画面をクリックすると拡大表示します)

 この例2のように、「GROUP BY」というキーワードに続けて、集計のキーとなる列名を指定します。この例では、「製品ごとにいくつ注文があったか」ということでしたので、集計のキーは「製品」、すなわち、「ProductID」となります。

 次に、「SELECT」句の中にある、「Sum(Quantity)」という部分を見てみましょう。これは、Quantity列の合計を求める集計関数です。集計関数には、Sumのほかに次のような関数があります。

MAX
最大値
MIN
最小値
AVG
平均値
COUNT
データの個数

 例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
画面3 GROUP BYがエラーになる例(画面をクリックすると拡大表示します) 画面3 GROUP BYがエラーになる例(画面をクリックすると拡大表示します)

 もし、強制的にUnitPriceを表示したい場合は、UnitPriceをGROUP BYに追加します。

【例5】

SELECT ProductID, UnitPrice, Sum(Quantity)
FROM "Order Details"
GROUP BY ProductID, UnitPrice
画面4 製品ごと、単価ごとに集計をとったところ(画面をクリックすると拡大表示します) 画面4 製品ごと、単価ごとに集計をとったところ(画面をクリックすると拡大表示します)

 ただし、この例5では同じProductIDを持つ製品でも違うUnitPriceを持つ行が存在する場合、1つの製品が複数の行に分かれてしまい、意図した結果は得られません。また、すべての行を集計の対象としたい場合は、次の例6のように、GROUP BYの指定を省きます。ただしこの場合は、上記のルールのとおり、SELECT句には集計関数しか指定することはできませんので、注意が必要です。

【例6】

SELECT Sum(Quantity)
FROM "Order Details"
画面5 全体の個数の合計(画面をクリックすると拡大表示します) 画面5 全体の個数の合計(画面をクリックすると拡大表示します)

列名の指定「AS」

 集計関数を使うと、結果の表示の際に「列名」が表示されないことに気が付きましたか? 次の例7のように「AS」句を使用することで、列名の指定をすることが可能です。

【例7】

SELECT ProductID AS "製品ID", Sum(Quantity) AS "個数合計"
FROM "Order Details"
GROUP BY ProductID
画面6 「AS」句を使用することで列名の指定ができる(画面をクリックすると拡大表示します) 画面6 「AS」句を使用することで列名の指定ができる(画面をクリックすると拡大表示します)

特定の集計行のみの表示

 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
画面7 「HAVING」句を使用して抽出条件を指定したところ(画面をクリックすると拡大表示します) 画面7 「HAVING」句を使用して抽出条件を指定したところ(画面をクリックすると拡大表示します)

 上記の例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実践講座」バックナンバー

Copyright© 2014 ITmedia, Inc. All Rights Reserved.

TechTargetジャパン

iPhone 6 Plus SIMフリー版、プレゼント!
Loading

ホワイトペーパー(TechTargetジャパン)

注目のテーマ

Focus

- PR -

転職/派遣情報を探す

【転職サーチ】SIer/Web企業/新規事業 スマホ開発で、あなたのキャリアを生かす

「派遣・フリーで働くメリット」とは? 活躍する派遣エンジニアの本音

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。