以前DISTINCTの使い方について紹介しました。
DISTINCTを使うと重複した値を1つにまとめられましたよね。
実務でDISTINCTを使うときはCOUNT関数と一緒に使うことが多いのではないでしょうか。
今回はより実務的なDISTINCTの使い方について紹介します。
COUNT関数とは
COUNT関数とは集約関数の1つで数を集計するときに使います。
特にレコードの数を求めたいときはこのCOUNT関数を使いますね。
DISTINCTとCOUNT関数を一緒に使う
DISTINCTとCOUNT関数を一緒に使うことで重複を省いたレコード(=一意なレコード)の数を調べられます。
セットで使うときはこのように書きます。
SELECT
COUNT(DISTINCT カラム名)
FROM
テーブル名
COUNT関数の中にDISTINCT カラム名
を入れてあげましょう。
処理の順番は先にカラムの重複を省きます。レコードが一意になった後でレコードの数を数えるという感じです。
では実際にサンプルデータでクエリを実行してみましょう。
サンプルデータ
1週間のトレーニングデータを用意しました。
スクワットとプッシュアップが重複しているのでレコード数は7ですね。
今回は「トレーニングメニューが何種類あるか?」知りたいのでCOUNT(DISTINCT)
を使って求めましょう!
SELECT
COUNT(DISTINCT menu) AS `トレーニングメニューの数`
FROM
`sql-book-384011.sample.20230805_training_menu_week`
トレーニングメニューはこちらの4種類なので一致していますね。
- アブローラー
- スクワット
- プッシュアップ
- ベンチプレス
たとえレコードが重複していたとしても、COUNT(DISTINCT)
を使うと一意なレコード数を求められました!
補足 集計関数とDISTINCTを一緒に使うとカラム順序は関係ない
こちらの記事でよくある間違いとしてDISTINCTの前にカラムを書くとエラーになることを紹介しました。ところが集計関数と一緒に使った場合はカラムの順番でエラーはおきません。
SELECT
date AS `実施日`,
COUNT(DISTINCT menu) AS `トレーニングメニューの数`
FROM
`sql-book-384011.sample.20230805_training_menu_week`
GROUP BY
date
これはDISTINCTの処理先がmenuカラムだけになっているからでしょう。
DISTINCT単体のときは取り出すカラムすべてに処理をしていました。そのため書く順番が関係したんですね。
まとめ
今回はDISTINCTとCOUNT関数をセットに使う方法について紹介しました。
重複した数ではなく一意なレコードの数を集計する機会はよくあるでしょう。
そのときはCOUNT(DISTINCT カラム名)
を使って求めてあげればOKですね!