MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

【MySQL】COUNT()とCASE文を使って、特定の数値より大きい値と小さい値を別々の列でカウントする方法

はじめに

MySQLでは、COUNT()関数とCASE文を組み合わせることで、特定の数値よりも大きい値と小さい(以下の)値の件数を、1つのクエリで別々の列として集計できます。条件分岐を活用したこのテクニックは、レポート作成やデータ分析の場面で非常に便利です。

この記事では、サンプルテーブルを使いながら、具体的な手順をわかりやすく解説します。

サンプルテーブルの作成

まず、スコアを格納するためのテーブルを作成します。

mysql> create table DemoTable
(
    Score int
);
Query OK, 0 rows affected (0.71 sec)

テストデータの挿入

次に、INSERTコマンドを使っていくつかのレコードを挿入します。

mysql> insert into DemoTable values(40);
Query OK, 1 row affected (0.77 sec)
mysql> insert into DemoTable values(48);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values(59);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values(33);
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable values(38);
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable values(89);
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values(35);
Query OK, 1 row affected (0.12 sec)

登録データの確認

SELECT文ですべてのレコードを表示して確認しましょう。

mysql> select *from DemoTable;

実行結果は以下のとおりです。

+-------+
| Score |
+-------+
|    40 |
|    48 |
|    59 |
|    33 |
|    38 |
|    89 |
|    35 |
+-------+
7 rows in set (0.00 sec)

条件別にカウントするクエリ

ここが本題です。次のクエリでは、「45より大きい値」の件数と「45以下の値」の件数を、それぞれ別の列として表示しています。

mysql> select count( case when Score > 45 then 1 end) as CountOfValueGreaterThan45,
    count( case when Score <= 45 then 1 end) as CountOfValueLessThanOrEqualTo45
    from DemoTable;

実行結果

上記のクエリを実行すると、以下のような出力が得られます。

+---------------------------+---------------------------------+
| CountOfValueGreaterThan45 | CountOfValueLessThanOrEqualTo45 |
+---------------------------+---------------------------------+
|                         3 |                               4 |
+---------------------------+---------------------------------+
1 row in set (0.00 sec)

解説:なぜこのクエリが動くのか

ポイントはCASE文の動作にあります。CASE WHEN Score > 45 THEN 1 ENDは、条件を満たす行に対しては「1」を返しますが、条件を満たさない行にはNULLを返します。

COUNT()関数はNULLをカウントしないという特性があるため、結果的に条件を満たす行だけが件数として集計されます。この仕組みにより、複数の条件ごとのカウントを1回のクエリで同時に取得できるのです。

まとめ

  • COUNT()CASE文を組み合わせることで、条件別の集計を1つのクエリで実現できる
  • CASE文が条件不一致時にNULLを返す性質と、COUNT()がNULLを無視する特性が鍵
  • 閾値の比較(以上・未満など)も、比較演算子を変えるだけで柔軟に対応可能

このテクニックを覚えておくと、年齢層別の集計や売上ランク別の件数算出など、さまざまな場面で応用できます。ぜひ実際のデータベースでも試してみてください。

  1. MySQLで特定の値を持つ列の数をカウントする方法【SUM関数の活用】

    はじめにMySQLでは、SUM関数と加算演算子(+)・論理演算子(AND)を組み合わせることで、テーブル内の複数の列に含まれる特定の値(たとえば「1」)の合計個数や、すべての列がその値を持つ行数を簡単に集計できます。本記事では、サンプルテーブルを作成しながら、具体的なSQLクエリの書き方と実行結果をわかりやすく解説します。基本構文特定の値を持つ列の数をカウントする場合、以下のような構文を使用します。selectsum(yourColumnName1 + yourColumnName2 + yourColumnName3 ... N) as `anyAliasName1`,sum(yourCol

  2. C++でASCII値の合計がk未満・k超過の単語数をカウントする方法

    文字列 str(1つの文章)と整数 k が与えられます。この問題の目的は、str に含まれる単語のうち、ASCII値の合計が k 未満になる単語の数と、k より大きくなる単語の数をそれぞれ求めることです。 ASCIIとは ASCII(アスキー)とは、言語を構成する各文字に割り当てられた一意のコード番号のことです。英字・数字・記号にはそれぞれ固有の数値が対応しており、単語を構成する各文字のコード値を足し合わせることで、単語ごとの合計値を計算できます。 具体例で理解しよう 例1 入力: str = “This is ASCII”、k = 300 出力: ASCII値の合計がk未満の単語数: