SQL GROUP BY 句と集約関数

今回は,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

idemployee_namework_dateworking_hours
1佐藤一郎2024-03-018.0
2鈴木花子2024-03-017.5
3佐藤一郎2024-03-028.0
4鈴木花子2024-03-026.0
5高橋健太2024-03-018.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_nametotal_hours
佐藤一郎16.0
鈴木花子13.5
高橋健太15.0

このように,各従業員の名前(employee_name)でグループ化されたデータごとに,勤務時間(working_hours)の合計値を出すことができる。実行結果のレコード数は,グループ化されたemployee_name の数(3行) 返される。

もちろん他の集約関数 (AVG や MAX など)も同様に使用することができる。

他の実行例も作ろうと思ったけど,疲れたのでここまで。

コメント

タイトルとURLをコピーしました