ACCESSを、勉強して、真っ先に感動したのは、データをグループ化できるということです。
Excelでもできますが、私は、イマイチExcelのグループ化は理解できていません。
ACCESSのグループ化は、それだけカンタンということです。
VBAと違って、個性が出にくいコード、文法ですようね。
個性がないということは、初心者でも、一定のルールに従えば、だれでも、同じ結果がでます。
目次
SQL文で、グループ化後の集計をする
こんにちは。伊川(@naonaoke)です。 前回は、SQL文で、テーブルとテーブルをつなげるということをしました。 SQLを勉強していて、思うのは、もっと、早い段階でSQLを勉強しておけばよかったと思います。 デザインビューで、クエリを作成するよりも、SQL文で実行する方が、はるかにイメージが沸くからです。 ACCESSというアプリは、帯に短し、タスキに長しというイメージがありました。 しかし、様々な世界への入り口を見せてくれたような気がします。 特に、SQLに関してだけでも、ACCESSを使って勉強すべきでしょう。 今回は、グループ化に集計をします。 ここも、SQLを利用するには、重要な事柄になります。このブログはこんな人にお勧め
このブログはこんな人にお勧め
✔ACCESSでクエリを勉強している人
✔高度なクエリを書きたい人
✔SQL文を勉強している人
このブログを、読み終わるころには・・・・
このブログの結論
ACCESSには、グループ化と言っても様々なグループ化の方法があります。
このグループ化を理解することで、より、高度な集計ができるようになります。
SELECT文が、解釈される順序
上記のように解釈されます。SQL文の流れ
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列の平均値の大きい順に整列せよ
グループ化後の集計 作業手順 その1 HAVING句
HAVINGは、持っているの進行形ですね。 つまり、該当しているというニュアンスです。 salary列の平均値が30万円以上という条件で、dep_id列およびsalary列の平均値を求めよ レコード件数が2以上という条件で、それに該当するdep_id列とレコード件数を求めよ GROUP BYで、グループ化されたデータの集計は、WHERE句は利用しません。 WHERE句は、行のデータを抽出するのに利用します。 HAVING句は、グループのデータを抽出する条件を指定します。 この両者の決定的な違いは、HAVING句は、集計関数が利用できす。 つまり、FROM句の後で、GROUP BYされていることから、SELECT句で、データを取得する前に、すでに、データを取得しているからです。 よって、HAVING句は、GROUP BYの後ろに記載します。グループ化後の集計 作業手順 その2 複雑なグループ集計をする
クエリは、複雑になれば、複雑になれるほど、難しくなると思いがちです。 部署ごとに、グループ分けして、それぞれの部署の最高額の給料をもらっていえる社員の名前と給料を取得する このようなクエリを作成します。 デザインビューで確認すると下記のようになります。 ところで、テーブルE1って、どこからきたのでしょうか? SELECT dep_id, name, salary FROM MT_Empoyee AS E1 上記のクエリを実行すると、下記のようになります。 ここのE1が、テーブルです。 複数のテーブルを参照するときや、別名を設定することで、SQL文の記述する量が短くなります。 このE1は、メインクエリで参照します。 SELECT MAX(salary) FROM MT_Empoyee AS E2 この部分は、サブクエリで参照します。 それがE2となります。 VBAでいうなら、変数で簡略化するようなイメージです。 このクエリのことを相関クエリといいます。 メインクエリが実行されると、サブクエリが実行され、処理されます。 このような結果になります。 各セクションで一番高いサラリーをもらった人を抽出します。 そして、条件に合うdep_idとdep_idが等しいものを抽出します。 これを相関クエリといいます。 1行ずつ、条件に合致するデータを探してきます。グループ化後の集計 作業手順 その3 相関クエリ
性別ごとにグループ分けして、それぞれの性別で最高齢の社員の性別、名前、生年月日を取得せよここがポイント
ここがポイント
相関クエリは、遅いと言われています。
しかし、このように、複数のテーブルを参照するような場合には、テーブルをE1と置くというように変形できます。
この書き方は、他のサイトでも見たことがありません。
本当に勉強になるSQLの書き方でした。
動画とブログでわかりやすくExcelとACCESSを紹介しています
まとめ
一応今回で、抽出系のSQLは終了します。 次回は、このSQLをVBAで実行します。 今回も最後まで読んでいただきありがとうございました。 今回のサンプルファイルは、No300です。毎日の業務が、3時間短縮できます
わからない事を延々と考えるのは、無駄です。
- なんで作動かないの?
- もうやだ!VBAなんか嫌い!
- ネットで調べても情報がない!
必ず作動するコードが、ここにあります。