サーバー運用していてデータベースの仕様を理解してくると、次にやりたいと思うのがデータ集計方法です。特に初心者はSQLの膨大な文字列に立ち尽くしてしまい、やっぱ集計はいいやといって諦めてしまう人も多いかと思います。そんな人にはこの記事で紹介しているSQLのGROUPBYを使ったデータ集計方法を紹介しています。また、SQLのGROUPBYの便利な使い方も紹介しているので、プログラムコードが分からなくてもこの記事をご覧いただければあるデータベースを使いこなせるようになると思います。
そもそもGROUPBYって何する命令?
SQLのGROUPBYの使い方は、Bluetoothでいうペアリング化だと思ってください。例えばペアリングはパソコンとBluetoothデバイスを電波で関連付けすることで、接続できるようになりますよね。それをデータ同士で行うときにSQLのGROUPBYを使うと覚えておきましょう。例えばとあるレストランのメニューの情報があったとします。しかし、1口にレストランのメニューといっても、使われている材料や値段や売っているお店など1つのメニューに色々な情報があります。ですがそのレストランでは値段を見直すために特定の材料のみ使われているメニューを知りたいと思いました。そこでSQLのGROUPBYで命令して、売られている都市と材料のデータのみを表示するように命令するわけです。例えば「SELECT material , place」でカラムを選択してから「GROUP BY material , place」と命令すると、カラム分けされたmaterialとplaceの部分のみを表示できます。
| 命令実行前の画面 | |||
| menu | place | price | material |
| キャロットジュース | 東京 | 240円 | carrot |
| オレンジジュース | 東京 | 170円 | orange |
| ポテトサラダ | 北海道 | 480円 | potato |
| カニのお寿司 | 北海道 | 2400円 | crab |
| お好み焼き | 広島 | 790円 | meat |
| 鯛めし | 愛媛 | 1200円 | seabream |
| 命令実行後の画面 | |
| place | material |
| 東京 | carrot |
| 東京 | orange |
| 北海道 | potato |
| 北海道 | crab |
| 広島 | meat |
| 愛媛 | sea bream |
COUNT関数を使った応用編
SQLのGROUPBYの使い方で、良く使うのはCOUNT関数を使った方法です。COUNT関数とは特定のカラムにあるデータの数を数える命令文です。例えば前の見出しで紹介した単純な表を分析するなら使う必要もありませんが、莫大な数のデータを数えるとなると手作業では難しい上に数え間違いがあると最初からやり直しになってしまいます。そこでCOUNT関数を使ってコンピューターにデータの数を数えさせるわけです。例えば「SELECT material, COUNT(material) FROM 命令実行前の画面 GROUP BY material;」とすると、materialのカラムにあるデータの種類をそれぞれカウントしなさいという命令文になり、以下の用に表示されます。
| material | COUNT(material) |
| carrot | 1 |
| potato | 1 |
| meat | 1 |
| seabream | 1 |
MAX関数とMIN関数を使ったGROUPBYの活かし方
MAX関数とMIN関数は、それぞれ前の見出しで紹介したpriceの最大値と最小値を求めるときに使う巻数です。最大値を求めるときの使い方は、「SELECT place, MAX(price) AS 最高価格 FROM 命令実行前の画面 GROUP BY place;」です。この命令文は、placeのカラム内にある各場所のpriceの最大値を求めろという命令文になります。つまり、実行すると以下のような結果になります。反対にMAXの部分をMINにすると最小値を求める命令文になります。なお、広島と愛媛はデータはそれぞれ1つしか存在しないので同じ表示結果になります。
| MAX関数を使った場合 | |
| place | 最高価格 |
| 東京 | 240円 |
| 北海道 | 2400円 |
| 広島 | 790円 |
| 愛媛 | 1200円 |
| MIN関数を使った場合 | |
| 東京 | 170円 |
| 北海道 | 480円 |
| 広島 | 790円 |
| 愛媛 | 1200円 |
関連付けたデータの合計値を求めたい場合
SQLのGROUPBYには、SUM関数を併用することで合計値を求めるといった使い方が可能です。やり方は、「SELECT place, SUM(price) AS 合計価格 FROM 命令実行前の画面 GROUP BY place;」と入力するだけです。一見すると命令文が長くて少しわかりにくいと感じるかもしれませんが、英語の文法と同じように主語を後ろにして翻訳すれば分かりやすいと思います。要するに「SELECT place」で都市を選択して、「SUM(price)」で平均値を求めろと命令するわけです。しかし、これだけだと主語が無いため、「FROM 命令実行前の画面 GROUP BY place;」でどこのデータから平均値を求めるかを選択します。そして実行結果を「AS 合計価格」に表示しろという命令になります。つまり日本語に翻訳すると、「合計値を求めろ!データは命令実行前の画面にある」となるわけです。そして実行すると以下のような結果が得られます。
| place | 合計価格 |
| 東京 | 410円 |
| 北海道 | 2880円 |
| 広島 | 790円 |
| 愛媛 | 1200円 |
平均値を集計する方法について
SQLのGROUPBYは、AVG関数を使うことで平均値を割り出すといった使い方が可能です。前の見出しで使った表で平均値を割り出す場合、「SELECT place, AVG(price) AS 平均価格 FROM 命令実行前の画面 GROUP BY place;」で可能で結果は以下のようになります。ここまでの命令文をご覧になっていただくと分かると思いますが、極端な話AVGの部分を他の関数に変更すれば平均値を求めたり合計値を求めたりができるという簡単な命令になっているんです。「AS 平均価格」はあくまで計算結果を表示するための表を作るときに項目名を指定するための命令であって、平均値を求めるために必ず平均価格にしなければいけないわけではありません。また、AVGの部分をTRUNCにすれば小数点以下を切り捨てられますし、四捨五入したいときはROUND関数で可能です。加えて切り捨てや四捨五入する位を表示した場合は、TRUNC(price, 2)など関数と指定したカラムの後にコロンと数字を付けてあげれば、指定した小数点の位を四捨五入したり切り捨てたりしてくれます。
| place | 平均価格 |
| 東京 | 205円 |
| 北海道 | 1440円 |
| 広島 | 790円 |
| 愛媛 | 1200円 |
まとめ
SQLのGROUPBYは、平均値や合計値を求める関数を併用することで、データ集計が楽になるといった使い方が可能です。一見すると命令文が難しく見えますが、英語の文法のように簡単な作りになっており、関数を入力する場所と出力する場所を指定してあげればデータ収集を大きく助けてくれます。なお、この記事の内容は全てSQLITEを使ったローカル環境で試しているので、同じ環境で使う予定の人は命令文を少し変えるだけで活用できるのでぜひ使ってみてください。

