前回の続き
今回は、グループ化をやりたいと思います。
以前に、DISTINCTを使いましたが、それとはちょっと違います。
ちなみにDISTICTは、こんな風に書きました。
SELECT DISTINCT PersonType FROM [Person].[Person]
出力はこんな感じ
重複を削除するのが、DISTINCTでしたね。
GROUP BY
今回やるのは、重複を削除したうえで、集計をすることを目的とします。
この際集計関数というのがあり、例えば
1. COUNT()・・・データ数
1. SUM()・・・合計
1. AVG()・・・平均
などなどたくさんあるのですが、どれを使うのも書き方は変わらないので、ひとまず今回はCOUNT()を使っていきます。
注意するのは、なにをグループ化して、何を集計するかということです。
この際、COUNTはデータの個数なので、カラムが文字型でも集計できますが、SUMやAVGは数値型でないとエラーになるので注意してください。
では早速やってみよう。
Person.Personテーブルより、PersonTypeのデータごとに、BusinessEntityIDがいくつあるかを集計します。
この際、データの個数はNULL以外を数えるため、データの中身自体は意味がありません。
SELECT PersonType, COUNT(BusinessEntityID) FROM Person.Person GROUP BY PersonType
出力はこんな感じです。
グループ化するカラムをGROUP BYで表してあげる必要があります。
WHEREと組み合わせる際は、GROUP BYより先に書く
例えば、データをWHERE句で限定させたうえで集計させたいなんてことはよくある。
この際、GROUP BYより先にWHERE句を書いておかないとエラーになります。
こんなかんじ
SELECT PersonType, COUNT(BusinessEntityID) FROM Person.Person WHERE MiddleName IS NOT NULL GROUP BY PersonType
出力はこんな感じ
さっきより、件数が減りましたね。
集計結果から出力を制御したいときはHAVINGを使う。
集計結果から、出力させるレコードを限定させるときはHAVINGを使います。
使い方はこんな感じ。
SELECT PersonType, COUNT(BusinessEntityID) FROM Person.Person WHERE MiddleName IS NOT NULL GROUP BY PersonType HAVING COUNT(BusinessEntityID) > 100
出力はこんな感じ
集計結果が、100より大きいレコードだけになりましたね。
以上、今回はここまで。