【ACCESS SQL】SQL文で、グループ化後の集計をする

記事
IT・テクノロジー

YouTubeでも紹介しています。是非ご覧ください。



ACCESSを、勉強して、真っ先に感動したのは、データをグループ化できるということです。
Excelでもできますが、私は、イマイチExcelのグループ化は理解できていません。


ACCESSのグループ化は、それだけカンタンということです。


SQL文で、グループ化後の集計をする
こんにちは。伊川です。
前回は、SQL文で、テーブルとテーブルをつなげるということをしました。
SQLを勉強していて、思うのは、もっと、早い段階でSQLを勉強しておけばよかったと思います。
デザインビューで、クエリを作成するよりも、SQL文で実行する方が、はるかにイメージが沸くからです。
ACCESSというアプリは、帯に短し、タスキに長しというイメージがありました。
しかし、様々な世界への入り口を見せてくれたような気がします。
特に、SQLに関してだけでも、ACCESSを使って勉強すべきでしょう。
今回は、グループ化に集計をします。
ここも、SQLを利用するには、重要な事柄になります。



このブログはこんな人にお勧め

ACCESSでクエリを勉強している人
高度なクエリを書きたい人
SQL文を勉強している人

このブログを、読み終わるころには・・・・

ACCESSには、グループ化と言っても様々なグループ化の方法があります。
このグループ化を理解することで、より、高度な集計ができるようになります。


SELECT文が、解釈される順序

1.png


上記のように解釈されます。
SELECT dep_id, AVG(salary)    dep_id列とsalary列の平均値を取得して、
FROM MT_Empoyee  MT_Empoyee表から、
WHERE gender = '男' gender列が「男」の行を抽出して
GROUP BY dep_id  dep_id列でグループ化して
HAVING AVG(salary) >= 300000  salary列の平均値が30万円以上のデータを抽出して、
ORDER BY AVG(salary) DESC;  salary列の平均値の大きい順に整列せよ
VBAと違って、個性が出にくいコード、文法ですようね。
個性がないということは、初心者でも、一定のルールに従えば、だれでも、同じ結果がでます。



グループ化後の集計 作業手順 その1 HAVING句

HAVINGは、持っているの進行形ですね。
つまり、該当しているというニュアンスです。


salary列の平均値が30万円以上という条件で、dep_id列およびsalary列の平均値を求めよ

2.png

3.png

レコード件数が2以上という条件で、それに該当するdep_id列とレコード件数を求めよ

4.png

5.png
GROUP BYで、グループ化されたデータの集計は、WHERE句は利用しません。

WHERE句は、行のデータを抽出するのに利用します。
HAVING句は、グループのデータを抽出する条件を指定します。
この両者の決定的な違いは、HAVING句は、集計関数が利用できす。
つまり、FROM句の後で、GROUP BYされていることから、SELECT句で、データを取得する前に、すでに、データを取得しているからです。
よって、HAVING句は、GROUP BYの後ろに記載します。



グループ化後の集計 作業手順 その2 複雑なグループ集計をする



クエリは、複雑になれば、複雑になれるほど、難しくなると思いがちです。

部署ごとに、グループ分けして、それぞれの部署の最高額の給料をもらっていえる社員の名前と給料を取得する

6.png

このようなクエリを作成します。
デザインビューで確認すると下記のようになります。
ところで、テーブルE1って、どこからきたのでしょうか?
7.png

SELECT dep_id, name, salary FROM MT_Empoyee AS E1

8.png
上記のクエリを実行すると、下記のようになります。
ここのE1が、テーブルです。
複数のテーブルを参照するときや、別名を設定することで、SQL文の記述する量が短くなります。



このE1は、メインクエリで参照します。
SELECT MAX(salary) FROM MT_Empoyee AS E2

9.png

この部分は、サブクエリで参照します。
それがE2となります。
VBAでいうなら、変数で簡略化するようなイメージです。
このクエリのことを相関クエリといいます。
メインクエリが実行されると、サブクエリが実行され、処理されます。

10.png

このような結果になります。


11.png


各セクションで一番高いサラリーをもらった人を抽出します。
そして、条件に合うdep_idとdep_idが等しいものを抽出します。
これを相関クエリといいます。
1行ずつ、条件に合致するデータを探してきます。

グループ化後の集計 作業手順 その3 相関クエリ



性別ごとにグループ分けして、それぞれの性別で最高齢の社員の性別、名前、生年月日を取得せよ

無題.png


12.png


ここがポイント

相関クエリは、遅いと言われています。
しかし、このように、複数のテーブルを参照するような場合には、テーブルをE1と置くというように変形できます。
この書き方は、他のサイトでも見たことがありません。
本当に勉強になるSQLの書き方でした。


まとめ

一応今回で、抽出系のSQLは終了します。
次回は、このSQLをVBAで実行します。
今回も最後まで読んでいただきありがとうございました。

サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す