とある勤怠管理システムにて、Oracle SQLを利用したDB作業手順のお作法について書いてみた_その3

こんにちは。ERPパッケージシステム導入コンサルタントのafroriansymです。保守コンサルはトラブル対応を鮮やかにさばいてなんぼです。

できればDB作業によりトラブル回避するといったイベントが発生することは避けたいのですが、どうしても避けられなかったりすることもたまーにあります。何か事件が発生するときには発生するものです。

今回の記事は、もちろんDBエンジニアやERPパッケージシステム導入コンサルタント向けです。

なにか思わぬデータ状況が見えてきた際に、GROUP BY句が使えると調査がはかどることがあります。トラブルの事象把握や原因の特定に役立つケースがあります。

というわけで、事例紹介です。

なお、リライト前提の記事です。(テーブル構造を画像で張り付ける予定)

https://d1f5hsy4d47upe.cloudfront.net/ab/ab032ee97cf547c6fa7b7d6525f6aa9e_t.jpeg

いつものごとく、テーブルやカラム名はフィクションです。

GROUP BY句を利用して特定の条件に合致するデータをカウントしたり合計する

勤怠システム上で、休暇を取得します。というデータで、2017年4月1日から4月30日までの勤怠期間中に、何回休暇を取得しているのかを確認するSQLを書いてみました。

SELECT
id,kyuka_id,date,count(date),sum(days)
FROM
KYUKA
where
kyuka_id = 1 and
date >= ‘2017/04/01’ and
date <= ‘2017/04/30’

group by
id,kyuka_id,date

こちらのGROUP BY句では、誰が(id ※ここでは社員ID)、どの種類の休暇を(kyuka_id ※年次有給休暇か失効積立休暇かそれ以外の休暇何か)、いつ(date ※日付)取得したかをまとめてデータ抽出します。

抽出結果からわかることとしてポイントは、

count(date)が、2かつ、sum(days)が1だと、半日休暇を同日に2回取得したデータとなります。同じ種類の休暇で、同じ日に、午前休暇と、午後休暇を取得したよ。というデータというわけです。

例)抽出されたデータ

id, kyuka_id, date,    count(date), sum(days)
100, 1,     2017/04/03,  2,      1

⇒ 2017/04/  に、社員ID:100 の人が、年次有給休暇を午前半日と午後半日で取得している。(kyuka_id = 1 は年次有給休暇と定義)

HAVING句を利用してさらに絞り込む

それでは、同じ日付に同じ種類の休暇で午前午後休暇を取得した場合のデータ抽出を一回で実施してみましょう。HAVINGを利用します。

SELECT
id,kyuka_id,date,count(date),sum(days)
FROM
KYUKA
where
kyuka_id = 1 and
date >= ‘2017/04/01’ and
date <= ‘2017/04/30’

group by
id,kyuka_id,date
having
count(date) > 1
and sum(days) > 1

こんな感じのSQLを応用して、とある修羅場をなんとか半日程で暫定対応を行いました。
数か月、毎月1日は徹夜のタイミングが続きまして、楽しい思い出の一つです。

GROUP BY と HAVING を見ていると、なんだかロジックツリーみたいに掘り下げるイメージと共通するものがあるなと感じます。
いろいろな開発言語と、プログラミング言語とは異なる思考フレームワークとを比較して考えてみると面白そうですね。

オラクル関連の記事を書いていきます

ここまで、SQL自体に関する記事を記載してきましたが、 オラクルのパフォーマンスやらに関する内容も書いてみたいと思っています。

とはいえ、最近のオラクルのバージョンにあっているかどうかなど、きちんと調べないとと感じています。

以下の書籍、書評がてら記事にする予定とします。

“Oracleの現場を効率化する100の技”

Oracleの現場を効率化する100の技
Oracleの現場を効率化する100の技

 

以上。

コメント

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