グループ化(CSVファイルをADOで扱う㉔)

CSVファイルをADOで扱う連載の24回目です。前回の記事はこちらになります。 hirocom777.hatenadiary.org

グループ化

前回は、サブクエリの色々な使いかたについてご紹介しました。使いこなすことで複雑なSQLコマンドを簡単に書くことができますね!!

f:id:HiroCom777:20220116152022j:plain

今回はグループ化についてご紹介したいと思います。

今回もSQLを指定してCSVファイルを確認できるツール(CSV_ReaderSQL)を使います。ツールは以下からダウンロードしてください。

CSV_ReaderSQL110.zip - Google ドライブ

GROUP BYでグループ分け

今回ご紹介するグループ化とは、指定した列の値ごとにデータをまとめる機能です。今回使用するファイルは以下です。ファイル名は成績.CSVとしましょう。

"名前","クラス","性別","点数"
"渡邊国男","A","男","76"
"吉永安子","B","女","67"
"松川章平","A","男","68"
"棚橋梨沙","A","女","90"
"村木道雄","C","男","83"
"国分円","C","女","90"
"菅正一郎","B","男","95"
"杉山龍宏","B","男","77"
"大槻香苗","C","女","70"

それでは、ツールでファイルのあるフォルダーを指定してから、以下のSQLコマンドを入力、実行してみてください。

SELECT クラス FROM [成績.csv] GROUP BY クラス

結果は以下の様になりました。

クラス
A
B
C

クラス名の一覧を表示しました。このCSVファイルに登録されているクラスはA,B,Cの3つだ言うことです。だからどうしたと言う訳なんですが、この機能は使い方にコツがあるんですよ。

集計関数と一緒に使う

それは、集計関数と併せて使うということです。集計関数は以下でご紹介しました。 hirocom777.hatenadiary.org それでは、クラスの人数を求めてみましょう。以下のSQLコマンドを実行してみてください。

SELECT クラス,COUNT(名前) AS 人数 FROM [成績.csv] GROUP BY クラス

結果は以下の様になりました。各クラス3人ずつです。

クラス 人数
A 3
B 3
C 3

この場合集計関数は、それぞれのグループについて集計を行います。 また、GROUP BYでまとめる列の指定は複数可能です。今度は各クラスの人数を男女ごとにまとめてみましょう。

SELECT クラス,性別,COUNT(名前) AS 人数 FROM [成績.csv] GROUP BY クラス,性別

結果は以下の通り。各クラスの男女の人数が表示されました。

クラス 性別 人数
A 2
A 1
B 2
B 1
C 1
C 2

HAVINGで絞る

それでは、上の結果から性別か男のデータだけを表示してみましょう。WHEREを使えばよさそうです。以下のSQLコマンドを実行してみてください。

SELECT クラス,性別,COUNT(名前) AS 人数 FROM [成績.csv] 
WHERE 性別 = '男' GROUP BY クラス,性別

結果は以下の様になりました。

クラス 性別 人数
A 2
B 2
C 1

ところで、GROUP BYに関係する機能としてHAVINGというものがあります。以下のSQLコマンドは、上と同じ結果を返します。

SELECT クラス,性別,COUNT(名前) AS 人数 FROM [成績.csv] 
GROUP BY クラス,性別 HAVING 性別 = '男' 

HAVINGWHEREと同じく結果を絞る機能を持っています。違いは実行されるタイミングです。WHEREはグループ化される前に実行されますが、HAVINGはグループ化されたあとに実行されます。両者の記述位置が異なるのはこのためです。そしてもう1つの特徴として集計関数が使えるという点が挙げられます。WHEREでは使えませんでしたよね。

まず、以下のSQLコマンドで各クラスの平均点を求めてみましょう。

SELECT クラス,FORMAT(AVG(点数),'0.00') AS 平均点数 FROM [成績.csv] GROUP BY クラス

結果は以下の様になりました。

クラス 平均点数
A 78.00
B 79.67
C 81.00

ここから平均点が80点以上のクラスを求めるには・・・

SELECT クラス,FORMAT(AVG(点数),'0.00') AS 平均点数 FROM [成績.csv] GROUP BY クラス
HAVING AVG(点数) >= 80

結果は以下の様になりました。ちゃんと求めることができています。

クラス 平均点数
C 81.00

次回はCSVファイルを作る

いかがでしたか?GROUP BYと集計関数、そしてHAVINGを使えば色々な集計結果を得ることができます。 いままでSQLコマンドを使って色々な読み取り方をご紹介してきましたが、次回は趣向を変えて、ADOでCSVファイルを作る方法をご紹介します。お楽しみに!! hirocom777.hatenadiary.org CSVファイルをADOで扱う連載記事はコチラからどうぞ