CSVファイルをADOで扱う連載の24回目です。前回の記事はこちらになります。 hirocom777.hatenadiary.org
グループ化
前回は、サブクエリの色々な使いかたについてご紹介しました。使いこなすことで複雑なSQLコマンドを簡単に書くことができますね!!
今回はグループ化についてご紹介したいと思います。
今回も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 性別 = '男'
HAVINGはWHEREと同じく結果を絞る機能を持っています。違いは実行されるタイミングです。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で扱う連載記事はコチラからどうぞ