【その6】sqlserver Selectクエリ(グルーピングしてみる)

【その6】sqlserver Selectクエリ(グルーピングしてみる)

この記事を読むのに必要な時間は約 10 分です。

今回のテーマはグルーピングです。検索する対象をグループ化してみます。

グルーピングしてみようぜ!

このグループ化ですが、グループ化しただけではあまり意味がありません。意味があるのはグループ化した結果に対して何をするか?となります。

それではさっそく見てみましょう。

いつも通り[ssms]から起動してください。

/****** SSMS の SelectTopNRows コマンドのスクリプト  ******/
SELECT  
       [漢字都道府県名]
      ,[漢字市区町村名]
      ,[漢字町域名]
  FROM [test001].[dbo].[yubin]

こんな感じです。

それではこのデータについてグループ化を行います。

都道府県毎のデータを作成する。

グループ化するのに必要な構文は以下です。

group by ●●●●

ほら、これもたいしたことないですね。

それでは実際にやってみましょう。

サンプルでは都道府県毎の●●を求めてみたいと思っていますので、グループ化する対象は

[漢字都道府県名]になります。

/****** SSMS の SelectTopNRows コマンドのスクリプト  ******/
SELECT  
       [漢字都道府県名]
      ,[漢字市区町村名]
      ,[漢字町域名]
  FROM [test001].[dbo].[yubin]
  group by [漢字都道府県名]

はい、エラーになりました。

なにか、小難しいことが書かれています。

メッセージ 8120、レベル 16、状態 1、行 4
列 ‘test001.dbo.yubin.漢字市区町村名’ は選択リスト内では無効です。この列は集計関数または GROUP BY 句に含まれていません。

慣れてきたら簡単です。

これは、グループ化した結果に対して、グループ化していない結果が混ざっていることにより発生しています。今回の場合は、

  1. [漢字市区町村名]
  2. [漢字町域名]

の、二つが対象ですね。

そのため、グループ化していないこのカラムを削除して再実行します。

/****** 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 [漢字都道府県名]

 

 

メッセージ 8117、レベル 16、状態 1、行 4
オペランドのデータ型 nvarchar は avg 演算子では無効です。

グループ化した後は、グループ化した後で何をしたいかを意識しましょう。

並び替え

上記までで、各都道府県毎に何個の市町村が存在するかはわかりました。

このデータについてぱっと見で

どこの都道府県が一番市町村が多いのか

を見た目で分かるように並び替えしたいと思います。

並び替えするときに必要な構文は以下です。

order by ●●●●

ほら、これもたいしたことないですね。

実際に追加してみましょう。

/****** SSMS の SelectTopNRows コマンドのスクリプト  ******/
SELECT  
       [漢字都道府県名] 
       ,count([漢字都道府県名])
  FROM [test001].[dbo].[yubin]
  group by [漢字都道府県名]
  order by count([漢字都道府県名])

値が小さいほうから並んでしまいますね。これは初期値が昇順になっているからです。

このままだと見づらいので、並び替えを降順にしてみましょう。

構文は以下の通りです。

order by ●●●● desc
/****** SSMS の SelectTopNRows コマンドのスクリプト  ******/
SELECT  
       [漢字都道府県名] 
       ,count([漢字都道府県名])
  FROM [test001].[dbo].[yubin]
  group by [漢字都道府県名]
  order by count([漢字都道府県名]) desc

 

ほぅ 正解は北海道なんですね。広いですからそんなものですかね

 

 

因みに、降順に並び替えるのに desc とつけましたが昇順の並び替えは asc をつけます。

ただ、デフォルトがそうなっているので、わざわざつける必要はありません。

グループ化は記事が長くなってきたので一度ここで区切ります!

 

タイトルとURLをコピーしました