【初学者必見!】SQLの基本、実務使用例を徹底解説!GROUP BY編

サムネイル SQL

※この記事にはプロモーションが含まれています。

ふりかえり

筆者
筆者

本記事は、SQLの基本、実務使用例編になります。

SQLの基礎に関しましては、

【初学者必見!】SQLの超基礎編の記事をご覧くださいませ。

A子
A子

本編に入ります!

group by関数の基本構文

筆者
筆者

まずは、基本構文から見ていきましょう!

select 集約したい列名, 集約関数(列名)
from テーブル名
group by グループ化する列名;

A子
A子

select,集約関数,from,group byね!

筆者
筆者

はい、そうです!

GROUP関数(または「集約関数」)は、複数の行をまとめて計算するための関数です。
通常のSELECT文では、1つの行ごとにデータを取得しますが、GROUP関数を使うと、特定の列の値をグループ化して計算することができます。

よく使う集約関数

関数説明
count(*)レコードの数を数える各部署の申請数
sum(列名)数値の合計を求める各部署の支給額の合計
avg(列名)数値の平均を求める各職員の平均申請数
min(列名)最小値を求める各職員の最初の申請日
max(列名)最大値を求める各職員の最新の申請日

実務レベルの使用例を見ていこう!

筆者
筆者

実際に、SQLを使用してデータを確認していきましょう。

SQLに関しては以下を使用して解説していきます。

create table文、select文、insert文、update文、delete文、

drop table文、につきましては、過去にアップロードした

【初学者必見!】SQLの超基礎編の記事をご覧くださいませ。

A子
A子

目次の、「ふりかえり」のところにそれぞれの記事のリンクが

貼ってあるよ!

または、サイドバーのカテゴリーにSQLがあるから、そちらからでも

参照できます!

[事前準備]今回、実行するSQLの一覧

create table 申請管理情報 (
    STAFF_NO varchar2(10) not null,   -- 職員番号 (Staff Number) 
    APPLI_NO varchar2(10) not null,   -- 申請番号 (Application Number) 
    APPLI_DATE date,                  -- 申請年月日 (Application Date) 
    DEPARTMENT varchar2(10),          -- 部署名(Department)
    constraint PK_申請管理情報 primary key (STAFF_NO, APPLI_NO)

);
create table 申請内容の詳細 (
    職員番号          varchar2(10) not null,  -- 親テーブルの STAFF_NO に対応
    申請番号          varchar2(10) not null,  -- 親テーブルの APPLI_NO に対応
    申請内容の詳細    varchar2(100),          -- 申請の詳細内容を格納するカラム(適宜サイズを調整してください)
    constraint PK_申請内容の詳細 primary key (職員番号, 申請番号),
    constraint FK_申請内容の詳細 foreign key (職員番号, 申請番号)
        references 申請管理情報 (STAFF_NO, APPLI_NO)
);

insert into 申請管理情報 (STAFF_NO, APPLI_NO, APPLI_DATE, DEPARTMENT) 
values ('1001', 'A001', TO_DATE('2024-02-25', 'YYYY-MM-DD'),'営業');
insert into 申請管理情報 (STAFF_NO, APPLI_NO, APPLI_DATE, DEPARTMENT) 
values ('1001', 'A002', TO_DATE('2024-02-26', 'YYYY-MM-DD'),'営業');
insert into 申請管理情報 (STAFF_NO, APPLI_NO, APPLI_DATE, DEPARTMENT) 
values ('1002', 'A003', TO_DATE('2024-02-27', 'YYYY-MM-DD'),'開発');
insert into 申請管理情報 (STAFF_NO, APPLI_NO, APPLI_DATE, DEPARTMENT) 
values ('1002', 'a003', TO_DATE('2024-01-27', 'YYYY-MM-DD'),'開発');
insert into 申請管理情報 (STAFF_NO, APPLI_NO, APPLI_DATE, DEPARTMENT) 
values ('1003', 'A004', TO_DATE('2024-02-28', 'YYYY-MM-DD'),'営業');

insert into 申請内容の詳細 (職員番号, 申請番号, 申請内容の詳細)
values ('1001', 'A001', 'レギュラーとハイオク間違えたので、もう一回入れに行きたいです。');
insert into 申請内容の詳細 (職員番号, 申請番号, 申請内容の詳細)
values ('1001', 'A002', 'ガソリン高いから、もっと補助してほしい');
insert into 申請内容の詳細 (職員番号, 申請番号, 申請内容の詳細)
values ('1002', 'A003', 'ハイオク満タンにしちゃった');
insert into 申請内容の詳細 (職員番号, 申請番号, 申請内容の詳細)
values ('1002', 'a003', 'レギュラー満タンにしちゃった');

部署ごとの申請数を集計する(count

select DEPARTMENT, count(*) as 申請数
from 申請管理情報
group by DEPARTMENT;

DEPARTMENTごとにグループ化し、各部署の申請数を集計しています。

各職員の最も古い申請日を取得する(min

select STAFF_NO, min(APPLI_DATE) as 最初の申請日
from 申請管理情報
group by STAFF_NO;

職員番号(STAFF_NO)ごとにグループ化し、その中で最も古いAPPLI_DATEを取得しています。

各職員の最新の申請日を取得する(max

select STAFF_NO, max(APPLI_DATE) as 最新の申請日
from 申請管理情報
group by STAFF_NO;

minの時と同じ考え方で、各STAFF_NOごとの最新のAPPLI_DATEを取得しています。

各職員の申請内容の件数を取得する(count

select 職員番号, count(*) as 申請内容数
from 申請内容の詳細
group by 職員番号;

count(*)を使用することで、申請内容の詳細テーブルのレコード数を職員番号ごとにカウントしています。

まとめ

GROUP関数を使うことで、次のような集計ができます。

  • count(*):グループごとの件数を数える
  • min(列名):グループごとの最小値を取得する
  • max(列名):グループごとの最大値を取得する
  • avg(列名):グループごとの平均を求める(DATE型の場合は変換が必要)
  • length(列名):文字列の長さを取得し、最大値・最小値を調べることが可能

筆者
筆者

group byについて解説しました。

関数を活用すると、データを簡単に集約して分析できます。ぜひ試してみてください!

次回もお楽しみに!

この記事を書いた人
たくたく

文系出身・3年目のWeb系エンジニアです。
C#とSQLを得意としています。
同棲生活は2年目に入り、日々仲良く楽しく暮らしています。
プライベートではバイクや車で旅行に行くことが趣味です。
サンリオ好きで、中でもシナモン推しです。
お酒好きとして毎週の晩酌をリラックスタイムにしています。

たくたくをフォローする
SQLエンジニア
シェアする

コメント

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