7. グループ化と集約
GROUP BYSQL によるグループ化と集
約、データの分析
1
URL: https://www.kkaneko.jp/de/ds/index.html
金子邦彦
謝辞:この資料では「いらすとや」のイラストを使用しています
データの把握
データ分析と洞察のためのスキル獲得
意思決定に役立つスキル獲得
2
アウトライン
1. イントロダクション
2. グループ化と集約
3. GROUP BY の基本
4. 演習
3
SQLFiddle のサイトにアクセス
Webブラザを使用
1. ェブブラザを開く
2. アドレスバーにSQLFiddleURLを入力
http://sqlfiddle.com/
URLが分からないときは、Googleなどの検索エンジンを利
用。「SQLFiddle」と検索し、表示された結果から
SQLFiddleェブサイトをクリック。
4
SQLFiddle の画面
5
右側のパネル: SQL問い合わせ
SELECT などを入力。
左側のパネル: テーブル定義、デー
タの追加など。SQLCREATE TABLE
INSERT INTO などを入力。
実行ボタン
結果ィンド
実行ボタン
SQLFiddle でのデータベース管理システムの選択
(高度な機能)
6
データベース管理システムの選択
(この授業では MySQL を使用)
7-1. イントロダクション
7
リレーショナルデータベースの仕組み
データをテーブルと呼ばれる表形式で保存
テーブル間関連で結ばれる。複雑な構造を持ったデータ
を効率的に管理することを可能に。
8
関連
リレーショナルデータベースの重要性
1. データの整合性: リレーショナルデータベースは、デー
タの整合性を保持するための機能を有する。これにより、
誤ったデータや矛盾したデータが保存されるのを防ぐこ
とができる。
2. 柔軟な問い合わせ(クエリ)能力: リレーショナルデー
タベースのSQLStructured Query Language)の使用に
より、複雑な検索やデータの抽出が可能になる。
3. トランザクションの機能: 一連の操作全体を一つの単位
として取り扱ことができる機能。これにより、データ
の一貫性と信頼性が向上する。
4. セキュリティ: アクセス権限の設定などにより、セキュ
リティを確保。
データの安全な保管、効率的なデータ検索・操作、ビジネス
や研究の意思決定をサポート。 9
SQL 理解のための前提知識
テーブル
データをテーブルと呼ばれる表形式で保存
問い合わせ(クエリ)
問い合わせ(クエリ)は、データベースから必要なデータ
を検索、加工するための指令
SELECT, FROM, WHERE など、多様なコマンドが存在。
結合、集約、ソート、副問い合わせなど、高度な操作も可
10
科目 受講者 得点
国語
A
85
国語
B
90
算数
A
90
算数
B
96
理科
A
95
11
テーブル「商品」からデータを取得すSQLの例
SELECT *FROM 商品;
SELECT 商品名 FROM 商品;
SELECT DISTINCT 商品名 FROM 商品;
SELECT 商品名, 単価 FROM 商品 WHERE 単価 > 80;
SELECT 商品名, 単価 FROM 商品 WHERE 単価 BETWEEN 80 AND 85;
SELECT AVG(単価)FROM 商品;
AVG, MAX, MIN, SUM: 平均、最大、最小、合計
COUNT: 行数
SELECT * FROM 商品 WHERE 商品名 LIKE '%';
*ん」、「ん*」「**」のよに書くことができる
Access では % でなく *
SELECT *FROM 商品 WHERE 商品名 IN ('みかん', 'りんご');
SQL によるテーブル定義
テーブル名成績
属性名科目、受講者、得点
属性のデータ型テキスト、テキスト、数値
データの整合性を保つための制約なし
12
CREATE TABLE 成績 (
科目 TEXT,
受講者 TEXT,
得点 INTEGER);
データ追加のSQL
13
成績
INSERT INTO 成績 VALUES('国語', 'A', 85);
INSERT INTO 成績 VALUES('国語', 'B', 90);
INSERT INTO 成績 VALUES('算数', 'A', 90);
INSERT INTO 成績 VALUES('算数', 'B', 96);
INSERT INTO 成績 VALUES('理科', 'A', 95);
科目 受講者 得点
国語
A
85
国語
B
90
算数
A
90
算数
B
96
理科
A
95
演習1.テーブル定義と
データの追加
トピックス
1. SQL によるテーブル定義
2. SQL によるデータの追加
3. 問い合わせ(クエリ)による
確認
14
Webブラザを使用
アドレスバーにSQLFiddleURLを入力
http://sqlfiddle.com/
URLが分からないときは、Googleなどの検索エンジンを利
用。「SQLFiddle」と検索し、表示された結果から
SQLFiddleェブサイトをクリック。
15
左側のパネルに、テーブル定義データの追加を行
SQL を入れる。
16
CREATE TABLE 成績 (
科目 TEXT,
受講者 TEXT,
得点 INTEGER);
INSERT INTO 成績 VALUES('国語', 'A', 85);
INSERT INTO 成績 VALUES('国語', 'B', 90);
INSERT INTO 成績 VALUES('算数', 'A', 90);
INSERT INTO 成績 VALUES('算数', 'B', 96);
INSERT INTO 成績 VALUES('理科', 'A', 95);
Build Schema」をクリック
17
右側のパネルに、問い合わせ(クエリ)を行SQL を入
れる。
Run SQL」をクリック
SQL 文が実行され、結果が表示される。
下側のインドで、結果を確認
18
select * FROM 成績;
集約
19
AVG, MAX, MIN, SUM: 平均、最大、最小、合計
COUNT: 行数
名前
徳川家康
源義経
西郷隆盛
豊臣秀吉
織田信長
記録 SELECT AVG(得点)FROM 記録;
82
SELECT MAX(得点)FROM 記録;
90
SELECT MIN(得点)FROM 記録;
75
SELECT SUM(得点)FROM 記録;
410
演習2.集約
トピックス
1. 平均 AVG
2. 最大 MAX
3. 最小 MIN
4. 合計 SUM
5. 行数 COUNT
20
Webブラザを使用
アドレスバーにSQLFiddleURLを入力
http://sqlfiddle.com/
URLが分からないときは、Googleなどの検索エンジンを利
用。「SQLFiddle」と検索し、表示された結果から
SQLFiddleェブサイトをクリック。
21
左側のパネルに、テーブル定義データの追加を行
SQL を入れる。(演習1のものをそのまま使
22
CREATE TABLE 成績 (
科目 TEXT,
受講者 TEXT,
得点 INTEGER);
INSERT INTO 成績 VALUES('国語', 'A', 85);
INSERT INTO 成績 VALUES('国語', 'B', 90);
INSERT INTO 成績 VALUES('算数', 'A', 90);
INSERT INTO 成績 VALUES('算数', 'B', 96);
INSERT INTO 成績 VALUES('理科', 'A', 95);
Build Schema」をクリック
23
右側のパネルに、問い合わせ(クエリ)を行SQL を入
れる。
Run SQL」をクリック
SQL 文が実行され、結果が表示される。
下側のインドで、結果を確認
24
SELECT AVG(得点) FROM 成績 WHERE 科目 = '国語';
自習1.算数の平均点の計算
目的:成績テーブルから算数の平均得点を算出する。
科目が算数の行について、得点の平均値を求めるSQL文を
書いてください。
ヒント:AVGを使い、WHERE 句で科目を算数に絞り込みま
す。
25
自習2.科目は問わず全体の最高点の計算
目的:成績テーブルから最高得点を算出する。
得点の最大値を求めるSQL文を書いてください。
ヒント:MAXを使います。
26
自習1の解答例
SELECT AVG(得点) FROM 成績 WHERE 科目 = '算数';
自習2の解答例
SELECT MAX(得点) FROM 成績;
27
これらの自習は、基本的な集約関数の使い方と、WHERE 及び GROUP BY
使用方法を理解し、練習するのに役立
7-2. グループ化と集約
28
グループ化
グループ化は、同じ属性値を共有するデータ集めるプロ
セス。
例:科目の「国語」、「算数」、「理科」でグループ化
例:受講者の「A」、「B」でグループ化
それぞれの値ごとにグループに分ける 29
科目 受講者 得点
国語
A
85
国語
B
90
算数
A
90
算数
B
96
理科
A
95
科目 受講者 得点
国語
A
85
国語
B
90
算数
A
90
算数
B
96
理科
A
95
科目
受講者
得点
国語
A
85
国語
B
90
科目
受講者
得点
理科
A
95
科目
受講者
得点
算数
A
90
算数
B
96
科目
受講者
得点
国語
A
85
算数
A
90
理科
A
95
科目
受講者
得点
国語
B
90
算数
B
96
グループ化と集約
成績表には科目、受講者、得点が記載されている
科目の「国語」のグループ
同様に、「算数」、「理科」のグループを形成
30
科目 受講者 得点
国語
A
85
国語
B
90
算数
A
90
算数
B
96
理科
A
95
科目
受講者
得点
国語
A
85
国語
B
90
科目
受講者
得点
理科
A
95
科目
受講者
得点
算数
A
90
算数
B
96
「国語」のグループを作ることにより国語の得点が見や
すくなった
グループで、集約(行数、平均、合計など)を実施
31
科目 受講者 得点
国語
A
85
国語
B
90
算数
A
90
算数
B
96
理科
A
95
科目
受講者
得点
国語
A
85
国語
B
90
元データ
「国語」のグループ
科目
受講者
得点
国語
A
85
国語
B
90
「国語」のグループ
行数:2 (受講者数を表す)
平均:87.5
合計:175
グループ化と集約
グループ化は、同じ属性値を共有するデータ集める
ロセス。
例:「科目」や「受講者」ごとにデータを分類できる
して形成されたグループを集約(行数平均値
計値)し、元のデータの概要を把握することが可能にな
る。
32
科目 受講者 得点
国語
A
85
国語
B
90
算数
A
90
算数
B
96
理科
A
95
科目
受講者
得点
国語
A
85
国語
B
90
科目
受講者
得点
理科
A
95
科目
受講者
得点
算数
A
90
算数
B
96
概要
得点の平均
国語
87.5
算数
93
理科
95
グループ化 集約
集約の種類のバリエーショ
33
A
3
B
2
元データ
行数
A
270
B
186
得点の合計
A
90
B
93
得点の平均
A
95
B
96
得点の最大
A
85
B
90
得点の最小
科目
受講者
得点
国語
A
85
国語
B
90
算数
A
90
算数
B
96
理科
A
95
グループ化における基準のバリエーション
34
A
90
B
93
得点の平均
国語
2
算数
2
理科
1
行数
「受講者」でグループ化
「科目」でグループ化
元データ
科目
受講者
得点
国語
A
85
国語
B
90
算数
A
90
算数
B
96
理科
A
95
グループ化の基準が受講者
35
元データ
A
90
B
93
得点の平均
「受講者」でグループ化
グループ化の基準が科目
36
元データ
国語
87.5
算数
93
理科
95
得点の平均
「科目」でグループ化
グループ化と集約のまとめ
グループ化
グループ化は、同じ属性値を共有するデータ集めるプロセス。
例: 科目ごとにグループを作成(国語、算数、理科
受講者ごとにグループを作成(AB)。
グループ化と集約による分析
各グループの行数、平均点、合計点などを算出してデータの概要を把
握。
集約の種類
・平均 AVG、最大 MAX、最小 MIN合計 SUM、行数 COUNT
データ分析への応用例
カテゴリ別、時系列別などでデータ分析を行
ビジネスインテリジェンスとして、売上のトレンド分析や顧客セグメ
ント分析に利用。
37
7-3. GROUP BY の基本
38
グループ化と集約
グループ化
GROUP BY は、特定の属性(「科目」、「受講者」)を
基準として、グループ化を行
集約
大量のデータから意味のあるデータを抽出
集約の種類:平均 AVG、最大 MAX、最小 MIN、合計
SUM、行数 COUNT
集約GROUP BY組み合わせることで、グループごとの
集約結果を得ることができる
39
GROUP BY の役割と書き方
SQL 問い合わせSELECT …」の中で、GROUP BY を使
用してデータをグループ化
1つ以上の属性を GROUP BY に指定してグループ化の基
準とする。
SELECT で「科目」と「COUNT(*)」を指定し、GROUP
BY で「科目」をグループ化の基準として設定
SELECT 科目, COUNT(*) FROM 成績 GROUP BY 科目;
40
すべての科目ごとに、受講者の数を計
演習3.GROUP BY による
グループ化と集約
トピックス
1. SELECT での集約の指定
2. GROUP BY での基準の指定
41
Webブラザを使用
アドレスバーにSQLFiddleURLを入力
http://sqlfiddle.com/
URLが分からないときは、Googleなどの検索エンジンを利
用。「SQLFiddle」と検索し、表示された結果から
SQLFiddleェブサイトをクリック。
42
左側のパネルに、テーブル定義データの追加を行
SQL を入れる。(演習1のものをそのまま使
43
CREATE TABLE 成績 (
科目 TEXT,
受講者 TEXT,
得点 INTEGER);
INSERT INTO 成績 VALUES('国語', 'A', 85);
INSERT INTO 成績 VALUES('国語', 'B', 90);
INSERT INTO 成績 VALUES('算数', 'A', 90);
INSERT INTO 成績 VALUES('算数', 'B', 96);
INSERT INTO 成績 VALUES('理科', 'A', 95);
Build Schema」をクリック
44
右側のパネルに、問い合わせ(クエリ)を行SQL を入
れる。
Run SQL」をクリック
SQL 文が実行され、結果が表示される。
下側のインドで、結果を確認
45
SELECT 科目, COUNT(*) FROM 成績 GROUP BY 科目;
受講者ごとの科目数
科目ごとの受講者数
右側のパネルに、問い合わせ(クエリ)を行SQL を入
れる。
Run SQL」をクリック
SQL 文が実行され、結果が表示される。
下側のインドで、結果を確認
46
SELECT 科目, COUNT(*) FROM 成績 WHERE 得点 >= 90 GROUP BY 科目;
科目ごとの、90点以上の成績の受講者数
自習3.受講者ごとの科目数
目的:SELECT, FROM の中での COUNT(*), GROUP BY
使用に上達する
次の SQLを実行し結果を確認
47
SELECT 受講者, COUNT(*) FROM 成績 GROUP BY 受講者;
自習4.科目ごとの平均点
目的:SELECT, FROM の中での AVG, GROUP BY の使用に
上達する
次の SQLを実行し結果を確認
AVG(得点) のよに書いていることに注意
48
SELECT 科目, AVG(得点) FROM 成績 GROUP BY 科目;
自習5.受講者ごとの平均点
目的: GROUP BY の使用に上達する
受講者ごとの平均点を求める SQL 文はどなるか?
結果として、次の結果を得たい。
ヒント:AVG, GROUP BY を使用する。自習4を参考に。
49
自習3
自習4
自習5
50
SELECT 受講者, AVG(得点) FROM 成績 GROUP BY 受講者;
GROUP BY のまとめ
グループ化の概念
GROUP BYは、指定した属性(例:「科目」、「受講
者」)に基づいてデータをグループ化する。
集約の利用
集約(AVG, MAX, MIN, SUM, COUNT)を使って、
量のデータから意味のある情報を抽出する。
グループ化と集約の組み合わせ
GROUP BYを集約関数と組み合わせることで、グルー
プ毎の統計を計算する
51
7-4. 演習
52
グループ化と分析の基本
グループ化と集約
概要(例:行数、平均、合計)の生成
データ分析
グループ化と集約を用いて、カテゴリ別、時系列別などの
データ分析を実施
ビジネスインテリジェンス
売上のトレンド分析や顧客セグメント分析など、ビジネス
意思決定に役立つ分析を実施
データの可視化
グループ化と集約ののち、チャートやグラフで情報を視覚
的に表現
53
今からの演習で行こと
売上を記録するためのテーブルを作成
架空の売上データを追加
日付、商品、個数、単価4つの属性を持つ
売り上げトレンドの分析
このテーブルに対してGROUP BYを使って、日付や商品を
基準としてグループ化
SUM売上合計を計算
54
演習4.GROUP BY による
グループ化と集約
トピックス
1. SELECT での集約の指定
2. GROUP BY での基準の指定
3. 各日付ごとに売り上げご受け
を計算
55
Webブラザを使用
アドレスバーにSQLFiddleURLを入力
http://sqlfiddle.com/
URLが分からないときは、Googleなどの検索エンジンを利
用。「SQLFiddle」と検索し、表示された結果から
SQLFiddleェブサイトをクリック。
56
左側のパネルに、テーブル定義データの追加を行
SQL を入れる。(前のものは不要なので消す
57
CREATE TABLE 売上 (
日付 DATETIME,
商品 TEXT,
個数 INTEGER,
単価 INTEGER
);
INSERT INTO 売上 VALUES('2023-01-01', '商品A', 1, 500);
INSERT INTO 売上 VALUES('2023-01-01', '商品A', 2, 500);
INSERT INTO 売上 VALUES('2023-01-01', '商品A', 3, 500);
INSERT INTO 売上 VALUES('2023-01-01', '商品A', 4, 500);
INSERT INTO 売上 VALUES('2023-01-01', '商品B', 1, 1500);
INSERT INTO 売上 VALUES('2023-01-01', '商品B', 2, 1500);
INSERT INTO 売上 VALUES('2023-01-01', '商品B', 3, 1500);
INSERT INTO 売上 VALUES('2023-01-01', '商品B', 4, 1500);
INSERT INTO 売上 VALUES('2023-01-02', '商品A', 1, 500);
INSERT INTO 売上 VALUES('2023-01-02', '商品A', 2, 500);
INSERT INTO 売上 VALUES('2023-01-02', '商品A', 3, 500);
INSERT INTO 売上 VALUES('2023-01-02', '商品A', 4, 500);
INSERT INTO 売上 VALUES('2023-01-02', '商品B', 1, 1500);
INSERT INTO 売上 VALUES('2023-01-02', '商品B', 2, 1500);
INSERT INTO 売上 VALUES('2023-01-02', '商品B', 3, 1500);
INSERT INTO 売上 VALUES('2023-01-02', '商品B', 4, 1500);
INSERT INTO 売上 VALUES('2023-01-03', '商品A', 1, 500);
INSERT INTO 売上 VALUES('2023-01-03', '商品A', 2, 500);
INSERT INTO 売上 VALUES('2023-01-03', '商品A', 3, 500);
INSERT INTO 売上 VALUES('2023-01-03', '商品A', 4, 500);
INSERT INTO 売上 VALUES('2023-01-03', '商品B', 1, 1500);
INSERT INTO 売上 VALUES('2023-01-03', '商品B', 2, 1500);
INSERT INTO 売上 VALUES('2023-01-03', '商品B', 3, 1500);
INSERT INTO 売上 VALUES('2023-01-03', '商品B', 4, 1500);
Build Schema」をクリック
58
右側のパネルに、問い合わせ(クエリ)を行SQL を入
れる。
Run SQL」をクリック
SQL 文が実行され、結果が表示される。
下側のインドで、結果を確認
59
SELECT 日付, SUM(個数 * 単価)
FROM 売上
GROUP BY 日付;各日付ごとに売上合計(個数×
単価)を計算
60
自習6.商品Aの総売上の計算
次のよに、売上テーブルから商品Aの総売上を計算したい。
そのために、
商品Aに関するすべての行の個数と単価を掛け合わせて総売
上を求めるSQL文を書いてください
ヒント:SUMを使い、WHEREで商品Aのみを選択
61
自習7.日付別の商品別総売上の計算
各日付における商品別の総売上を求めたい。
日付と商品ごとにグループ化し、それぞれの総売上を求める
次の SQL文を実行し結果を確認してください
SELECT 日付, 商品, SUM(個数 * 単価) FROM 売上 GROUP BY 日付,
;
ヒント:GROUP BY句を使用して日付と商品によってグ
ループ化し、SUMで総売上を計算 62
解答例
自習6.
SELECT SUM(個数 * 単価) FROM 売上 WHERE
= '商品A’;
自習7.
63
演習まとめ
集約
集約の種類:SUM, AVG, COUNT, MAX, MIN
SELECT AVG(得点) FROM 成績 WHERE 科目 = '国語’;
(国語の平均点を計算)
SELECT SUM(個数 * 単価) FROM 売上 WHERE 商品 = '商品
A’;
(商品Aの総売上を計算)
データ分析:
グループ化を通じてデータのパターンやトレンドを明らかにす
る。
GROUP BY用いて関連するデータをグループ分け
SELECT 科目, AVG(得点) FROM 成績 GROUP BY 科目;
(科目別の平均点を計算)
SELECT 日付, SUM(個数 * 単価) FROM 売上 GROUP BY
;
(日付ごとの総売上を計算) 64
全体まとめ
グループ化
グループ化は、同じ属性値を共有するデータ集めるプロセス。
例: 科目ごとにグループを作成(国語、算数、理科
受講者ごとにグループを作成AB
集約の種類
・平均 AVG、最大 MAX、最小 MIN、合計 SUM、行数 COUNT
GROUP BY の利用
SQL 問い合わせSELECT 」の中で、GROUP BY を使用してデータ
をグループ化
1つ上の属性 GROUP BY に指定してグループ化の基準とする
科目ごとに受講者の数を数える
SELECT 科目, COUNT(*) FROM 成績 GROUP BY 科目;65
全体まとめ
データ分析の応用
グループ化によりカテゴリ別、時系列別の分析が可能に。
ビジネスインテリジェンスにおける売上トレンドや顧客セグメントの
分析に利用。
66
データの把握
複雑なデータセットを簡単なSQLコマンドで分析し、
集約することで、データをより深く把握できるよ
なる。
データ分析と洞察のためのスキル獲得
GROUP BY を活用してデータをグループ化し、特定
の属性に基づいたパターンやトレンドを明らかにする
スキルが身につく。
意思決定に役立つスキル獲得
効率的なデータ整理と分析を通じて、ビジネスの意思
決定に必要な洞察を提供する分析を行ことができ、
データを視覚化することで他者に情報を伝えるスキル
が強化される。
67