ふりかえり

本記事は、SQLの基本、実務使用例編になります。
SQLの基礎に関しましては、
【初学者必見!】SQLの超基礎編の記事をご覧くださいませ。

本編に入ります!
group by関数の基本構文

まずは、基本構文から見ていきましょう!
select 集約したい列名, 集約関数(列名)
from テーブル名
group by グループ化する列名;

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

はい、そうです!
GROUP関数(または「集約関数」)は、複数の行をまとめて計算するための関数です。
通常のSELECT文では、1つの行ごとにデータを取得しますが、GROUP関数を使うと、特定の列の値をグループ化して計算することができます。
よく使う集約関数
| 関数 | 説明 | 例 |
|---|---|---|
count(*) | レコードの数を数える | 各部署の申請数 |
sum(列名) | 数値の合計を求める | 各部署の支給額の合計 |
avg(列名) | 数値の平均を求める | 各職員の平均申請数 |
min(列名) | 最小値を求める | 各職員の最初の申請日 |
max(列名) | 最大値を求める | 各職員の最新の申請日 |
実務レベルの使用例を見ていこう!

実際に、SQLを使用してデータを確認していきましょう。
SQLに関しては以下を使用して解説していきます。
create table文、select文、insert文、update文、delete文、
drop table文、につきましては、過去にアップロードした
【初学者必見!】SQLの超基礎編の記事をご覧くださいませ。

目次の、「ふりかえり」のところにそれぞれの記事のリンクが
貼ってあるよ!
または、サイドバーのカテゴリーに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について解説しました。
関数を活用すると、データを簡単に集約して分析できます。ぜひ試してみてください!
次回もお楽しみに!










コメント