プログラ生活

プログラム初学者のためのポイントを書いていこうと思います。たまに脇道それた記事もありますが、息抜きだとおもって気長にお付き合いください。

【SQL Server(連載)】SELECT文 (グループ化) -7-

www.pon-x.jp

前回の続き

今回は、グループ化をやりたいと思います。
以前に、DISTINCTを使いましたが、それとはちょっと違います。
ちなみにDISTICTは、こんな風に書きました。

SELECT DISTINCT PersonType FROM [Person].[Person]

出力はこんな感じ
f:id:hanabusa-snow:20201122215735p:plain

重複を削除するのが、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

出力はこんな感じです。 f:id:hanabusa-snow:20201122215741p:plain
グループ化するカラムをGROUP BYで表してあげる必要があります。

WHEREと組み合わせる際は、GROUP BYより先に書く

例えば、データをWHERE句で限定させたうえで集計させたいなんてことはよくある。
この際、GROUP BYより先にWHERE句を書いておかないとエラーになります。
こんなかんじ

SELECT 
    PersonType,
    COUNT(BusinessEntityID)
FROM Person.Person
WHERE MiddleName IS NOT NULL
GROUP BY PersonType

出力はこんな感じ f:id:hanabusa-snow:20201122215749p:plain
さっきより、件数が減りましたね。

集計結果から出力を制御したいときはHAVINGを使う。

集計結果から、出力させるレコードを限定させるときはHAVINGを使います。
使い方はこんな感じ。

SELECT 
    PersonType,
    COUNT(BusinessEntityID)
FROM Person.Person
WHERE MiddleName IS NOT NULL
GROUP BY PersonType
HAVING COUNT(BusinessEntityID) > 100

出力はこんな感じ
f:id:hanabusa-snow:20201122215754p:plain
集計結果が、100より大きいレコードだけになりましたね。







以上、今回はここまで。