ふりかえり

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

本編に入ります!
HAVINGの基本構文

まずは、基本構文から見ていきましょう!
SELECT 列名, 集計関数(列名)
FROM テーブル名
GROUP BY グループにしたい列
HAVING 集計関数による条件;

havingは最後にあるね。

はい、そうです!
HAVING の構文の流れ(全体のイメージ)は以下になります!
FROM→ データをどこから取るかWHERE→ 個々の行の条件(※必要に応じて使います)GROUP BY→ グループにまとめるHAVING→ グループごとの条件
実務レベルの使用例を見ていこう!

実際に、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)
);
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'),'営業');
部署ごとの申請件数が2件以上の部署を取得する
select department, count(*) as 申請件数
from 申請管理情報
group by department
having count(*) >= 2;

GROUP BY department によって、department ごとにレコードをグループ化しています。
count(*) を使い、各部署ごとの申請件数を算出しています。
HAVING count(*) >= 2 で、申請件数が2件以上の部署のみを取得しています。
申請件数が1件のみの職員を取得する
select staff_no, count(*) as 申請件数
from 申請管理情報
group by staff_no
having count(*) = 1;

GROUP BY staff_no により staff_no ごとにグループ化しています。
count(*) で職員ごとの申請件数を算出しています。
HAVING count(*) = 1 で、申請件数がちょうど1件の職員を取得しています。
各職員の最新の申請日が2024年2月以降である職員を取得する
select staff_no, max(appli_date) as 最新申請日
from 申請管理情報
group by staff_no
having max(appli_date) >= TO_DATE('2024-02-01', 'YYYY-MM-DD');

GROUP BY staff_no で職員ごとにグループ化。
MAX(appli_date) を使い、各職員の最新の申請日を取得。
HAVING max(appli_date) >= TO_DATE('2024-02-01', 'YYYY-MM-DD') で、最新申請日が2024年2月以降の職員を抽出。
まとめ
HAVING は GROUP BY の後に使う。
集計関数(COUNT, MAX, SUM など)と一緒に使う。
WHERE は個々のレコードをフィルタリングし、HAVING は集計結果に対してフィルタリングする。
HAVING を使うことで、特定の条件に合致した集計結果のみを取得できる。

havingについて解説しました。
HAVING は、データの傾向を分析するときに非常に便利です。例えば、「部署ごとの申請件数を調べたい」「2件以上の申請をしている人だけを取得したい」といった条件に活用できます。ぜひ使いこなしてみてください!
次回もお楽しみに!










コメント