MySQLの COUNT() でカラムが特定の値のレコード数だけ取得

タイトルの通り

MySQLでこういう場面がありました。

  • 特定カラムを元にレコード数取得したい
  • そのとき特定の値だけ持つのだけ抽出したい

この方法が分からなくて数時間なやんだことがあります。

でもやっと方法が分かったので、
ここでは MySQLで特定値を持つレコード数取得のやり方 を紹介!

やり方さえ分かれば、それほど難しくありません。

COUNT を使って実現したかったこと

たとえば仮に、次のテーブルを作るとします。

  • idカラム : ユニークなID
  • nameカラム : ユーザー名
  • countryカラム : 3文字の国コード

仮だけど、よくある感じのユーザーテーブルです。

 

実際に次のようなSQLクエリを発行して作ってみました。

▼ 次のようなSQLからテーブル作成

▼ そして適当なユーザーデータ挿入

 

このテーブルは次のような構成になります。

▼ テーブルの中身

id name country
1 Tanaka JPN
2 Tomy USA
3 Satou JPN
4 Watanabe JPN
5 Henry USA
6 Zhang CHN

このテーブルの country カラム

この値(JPN、 USA、CHN)ごとにレコード数取得したかったんです。

▼ イメージ図はこんな感じ

sum_of_usa sum_of_jpy sum_of_chn
2 3 1

こういうデータが取りたかったんですよね。

同カラムの中でさらに分類ごとに合計を求めるみたいな。

特定値を持つカラムだけをCOUNTするには...SQL例

当然ながら、COUNT単体では無理

普通に COUNT(country)  とかではレコード数が返るだけです。

 

ではどうすればいいのか・・・

その場合、次のように CASE WHEN ~ END  を使えばOK

▼ countryカラムの値ごとに COUNT する例

このSQLの sum_of_usa  の場合なら・・・

  • もし country = 'USA'  なら country を返す。
  • もし country != 'USA'  なら何も返さない

このように値ごとに COUNT が可能という訳です。

 

実際にこのクエリを実行した結果がコチラ

sum_of_usa sum_of_jpy sum_of_chn
2 3 1

うん、、ちゃんと値ごとにカウントできてます。

1つのクエリだけで取得できるのが便利かもしれない。

サブクエリとかも使う必要ありません。

ここまでのまとめ

大事なポイントだけまとめると次の通り

  • 普通に COUNT は使えない
    仮に COUNT(country)  とすると、そのカラムを持つレコード数合計が返る。
    特定の値(カテゴリーとか)で合計を出したいなら一工夫が必要
  • CASE WHEN ~ END を使えばOK
    たとえば COUNT(CASE WHEN country = 'USA' THEN country END)  みたいな感じ。
    これだけで同じ値を持つカラムのレコード数だけ取得できる。

以上、MySQLで特定値を持つカラムだけCOUNTする方法でした。

もし コード間違い、もっといい方法等あれば教えてください。ではまた

Commentsこの記事についたコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください