データベース千夜一夜第21回

データの集計(3)~集計関数とグループ化 長谷川裕行
有限会社 手國堂

SUM関数とグループ化

前回の最後に、テーブル「累積売上_fx」に記録されたレコードから『どの商品がいくつ売れているか』を調べる方法を紹介しました。このとき使ったのが、フィールドの値を合計するSUM関数です。


- 数量を合計する -

前回のSQLをもう一度紹介しておきましょう。

 SELECT 仕入先_mr.仕入先名, 累積売上_fx.商品名, SUM(数量) AS 数量合計

 FROM 累積売上_fx INNER JOIN
 商品_mr ON 累積売上_fx.商品ID = 商品_mr.商品ID INNER JOIN
 仕入先_mr ON 商品_mr.仕入先ID = 仕入先_mr.仕入先ID
 GROUP BY 仕入先_mr.仕入先名, 累積売上_fx.商品名
 ORDER BY 仕入先_mr.仕入先名

1行目の最後にある「SUM(数量) AS 数量合計」(アンダーラインの箇所)が、『「数量」フィールドの値をグループごとに合計する』指示で、SUMは集計関数と呼ばれる関数です。



- テーブル「累積売上_fx」の構造 -

今回は、主にテーブル「累積売上_fx」を使って、集計関数の使い方を紹介します。まず、「累積売上_fx」のフィールド構成を確認しておきましょう(前回紹介したものと同じ内容です)。すべてのフィールドで“Null”を許容していますが、基本的に「伝票番号」「伝票日付」の各フィールドにNullが記録されることはありません。

表1:テーブル「累積売上_fx」のフィールド構成
列名 データ型 長さ  
伝票番号   int 4
伝票日付 datetime   8
お客様ID int 4
氏名 nvarchar 30
読み nvarchar 30
性別 nvarchar 4
生年月日 datetime 8
商品ID int 4
商品名 nvarchar 50
数量 int 4
単価 money 8
金額 money 8


- グループ化と集計 -

先に紹介したSQLでは、仕入先の情報を表示するためJOINによる関連付けを行っているため、冗長で複雑になっています。関連付けをなくして単純にしてみましょう。

 SELECT 商品名, SUM(数量) AS 数量合計
 FROM 累積売上_fx
 GROUP BY 商品名


GROUP BY句で「商品名」をキーにグループ化しているため、まず同じ商品名のレコードが(販売先に関係なく)ひとまとめにされます。さらにSUM関数で「数量」フィールドの値を合計しているため、ひとまとめにされた同じ商品ごとに『販売された数量』が合計されます。

数量の合計にはAS句で「数量合計」という別名(エイリアス)を設定しているため、SQLを実行すると「商品名」と「数量合計」という2つのフィールドが表示されます。

単にGROUP BY句を使ってレコード群をグループ化するだけではあまり意味がありませんが、このようにグループ化と集計関数を組み合わせることによって、様々なフィールドの値を集計できるようになります。


- 集計関数 -

集計関数には、前々回紹介したCOUNTとSUM以外にもいくつかあります。以下にまとめておきましょう。それぞれ、()内に引数としてフィールド名を与えます。

COUNT:指定したフィールドに値の入っているレコードの数を返す
SUM:指定したフィールドの値の合計を返す
AVG:指定したフィールドの値の平均値を返す
MAX:指定したフィールドの値の中から最大値を返す
MIN:指定したフィールドの値の中から最小値を返す



トップページ
SUM関数とグループ化
数量を合計する
テーブル「累積売上_fx」の構造
グループ化と集計
集計関数
集計関数の使用例
グループ化と集計
HAVING句による絞り込み
グループ化と集計の例
DISTINCTオプション
あとがき
Copyright © MESCIUS inc. All rights reserved.