今回は,SQL を扱う上で重要なワードである GROUP BY 句と 集約関数について解説する。
この二つを組み合わせると,SQLを使用したデータ集計の幅が一気に広がる。
GROUP BY 句
その名の通り,テーブルをグループごとに分けるワード。(基本的に)SQL文の最後で
GROUP BY <column1>, <column2>,,,
のように列名を指定する。実行結果は,指定したColumn 名の組み合わせの数だけレコードが表示される(例は後ほど)
集約関数
SQL で検索したデータを集計してくれる関数。複数行のデータを計算して,1行のデータに直してくれる。代表的なものは以下の5つ。
- COUNT: テーブルの行(レコード)数をカウントする
- SUM: テーブルの数値列のデータを合計する
- AVG: テーブルの数値列のデータの平均値を出す
- MAX: テーブルの任意列の最大値を出す
- MIN: テーブルの任意列の最小値を出す
SELECT 句の後に,以下のように 列名を指定しながら実行する
SELECT AVG(column1), SUM(column2),,,
基本的に,集約関数のみを使用すると,1行のデータのみ返される。GROUP BY 句と組み合わせると,GROUPの数だけ行が返される。
実行例
以下のようなデータベースを例に,実際にGROUP BY と集約関数を使ってみる。
Ex.) 勤怠データテーブル attendance
id | employee_name | work_date | working_hours |
---|---|---|---|
1 | 佐藤一郎 | 2024-03-01 | 8.0 |
2 | 鈴木花子 | 2024-03-01 | 7.5 |
3 | 佐藤一郎 | 2024-03-02 | 8.0 |
4 | 鈴木花子 | 2024-03-02 | 6.0 |
5 | 高橋健太 | 2024-03-01 | 8.0 |
6 | 高橋健太 | 2024-03-02 | 7.0 |
社員ごとの総労働時間を出す
Sample Query
SELECT employee_name, SUM(working_hours) AS total_hours
FROM attendance
GROUP BY employee_name;
実行結果
employee_name | total_hours |
佐藤一郎 | 16.0 |
鈴木花子 | 13.5 |
高橋健太 | 15.0 |
このように,各従業員の名前(employee_name)でグループ化されたデータごとに,勤務時間(working_hours)の合計値を出すことができる。実行結果のレコード数は,グループ化されたemployee_name の数(3行) 返される。
もちろん他の集約関数 (AVG や MAX など)も同様に使用することができる。
他の実行例も作ろうと思ったけど,疲れたのでここまで。
コメント