この記事を読むのに必要な時間は約 10 分です。
今回のテーマはグルーピングです。検索する対象をグループ化してみます。
グルーピングしてみようぜ!
このグループ化ですが、グループ化しただけではあまり意味がありません。意味があるのはグループ化した結果に対して何をするか?となります。
それではさっそく見てみましょう。
いつも通り[ssms]から起動してください。
/****** SSMS の SelectTopNRows コマンドのスクリプト ******/ SELECT [漢字都道府県名] ,[漢字市区町村名] ,[漢字町域名] FROM [test001].[dbo].[yubin]
こんな感じです。
それではこのデータについてグループ化を行います。
都道府県毎のデータを作成する。
グループ化するのに必要な構文は以下です。
ほら、これもたいしたことないですね。
それでは実際にやってみましょう。
サンプルでは都道府県毎の●●を求めてみたいと思っていますので、グループ化する対象は
[漢字都道府県名]になります。
/****** SSMS の SelectTopNRows コマンドのスクリプト ******/ SELECT [漢字都道府県名] ,[漢字市区町村名] ,[漢字町域名] FROM [test001].[dbo].[yubin] group by [漢字都道府県名]
はい、エラーになりました。
なにか、小難しいことが書かれています。
列 ‘test001.dbo.yubin.漢字市区町村名’ は選択リスト内では無効です。この列は集計関数または GROUP BY 句に含まれていません。
慣れてきたら簡単です。
これは、グループ化した結果に対して、グループ化していない結果が混ざっていることにより発生しています。今回の場合は、
- [漢字市区町村名]
- [漢字町域名]
の、二つが対象ですね。
そのため、グループ化していないこのカラムを削除して再実行します。
/****** SSMS の SelectTopNRows コマンドのスクリプト ******/ SELECT [漢字都道府県名] FROM [test001].[dbo].[yubin] group by [漢字都道府県名]
はい!この通り都道府県の一覧がでてきました
でてきました・・・・
それだけのデータですね。
まったく楽しくないです。
そもそもグループ化する目的は何なのか?
そうです。
何か目的があってグループ化をします。グループ化したデータは集計関数にて集計してその結果を表示させることができます。
集計関数の例として以下の物があります。
MAX | 最大値 |
MIN | 最小値 |
COUNT | 何個データがあるか |
SUM | 数値の足し算 |
AVG | データの平均値 |
試しにCOUNTを使って何個データが存在しているかを出してみましょう。
/****** SSMS の SelectTopNRows コマンドのスクリプト ******/ SELECT [漢字都道府県名] ,count([漢字都道府県名]) FROM [test001].[dbo].[yubin] group by [漢字都道府県名]
はい。各都道府県に何個づつ市町村が存在するかが表示されましたね。
同じ感覚で 各都道府県の最大値を求めてみましょう。
[speech_bubble type=”drop” subtype=”L1″ icon=”02ukiyoe/tomi_R.png” name=”とみさん”]ん?[/speech_bubble]
[speech_bubble type=”drop” subtype=”L1″ icon=”02ukiyoe/yukiji_R.png” name=”ゆきじさん”]ん?[/speech_bubble]
[speech_bubble type=”drop” subtype=”L1″ icon=”02ukiyoe/yasu_R.png” name=”やすさん”]ん?[/speech_bubble]
[speech_bubble type=”drop” subtype=”L1″ icon=”02ukiyoe/taro_R.png” name=”たろさん”]ん?[/speech_bubble]
[speech_bubble type=”drop” subtype=”L1″ icon=”02ukiyoe/etsu_R.png” name=”えつさん”]あ![/speech_bubble]
[speech_bubble type=”drop” subtype=”R1″ icon=”02ukiyoe/haru_L.png” name=”はるさん”]あほや[/speech_bubble]
そうです。
これは不可能なのです。
何故ならば、各都道府県の最大値とは何を言っているのか?
そんなものは存在しません。
実際にクエリを実行してみますと、エラーにはなりませんがこの様に意味のないデータができあがります。
/****** SSMS の SelectTopNRows コマンドのスクリプト ******/ SELECT [漢字都道府県名] ,max([漢字都道府県名]) FROM [test001].[dbo].[yubin] group by [漢字都道府県名]
それぞれの都道府県名と同じデータですね。
また、平均(AVG)を求めようとすると明確にエラーになります。
/****** SSMS の SelectTopNRows コマンドのスクリプト ******/ SELECT [漢字都道府県名] ,AVG([漢字都道府県名]) FROM [test001].[dbo].[yubin] group by [漢字都道府県名]
オペランドのデータ型 nvarchar は avg 演算子では無効です。
グループ化した後は、グループ化した後で何をしたいかを意識しましょう。
並び替え
上記までで、各都道府県毎に何個の市町村が存在するかはわかりました。
このデータについてぱっと見で
どこの都道府県が一番市町村が多いのか
を見た目で分かるように並び替えしたいと思います。
並び替えするときに必要な構文は以下です。
ほら、これもたいしたことないですね。
実際に追加してみましょう。
/****** SSMS の SelectTopNRows コマンドのスクリプト ******/ SELECT [漢字都道府県名] ,count([漢字都道府県名]) FROM [test001].[dbo].[yubin] group by [漢字都道府県名] order by count([漢字都道府県名])
値が小さいほうから並んでしまいますね。これは初期値が昇順になっているからです。
このままだと見づらいので、並び替えを降順にしてみましょう。
構文は以下の通りです。
/****** SSMS の SelectTopNRows コマンドのスクリプト ******/ SELECT [漢字都道府県名] ,count([漢字都道府県名]) FROM [test001].[dbo].[yubin] group by [漢字都道府県名] order by count([漢字都道府県名]) desc
ほぅ 正解は北海道なんですね。広いですからそんなものですかね
因みに、降順に並び替えるのに desc とつけましたが昇順の並び替えは asc をつけます。
ただ、デフォルトがそうなっているので、わざわざつける必要はありません。
グループ化は記事が長くなってきたので一度ここで区切ります!