MySQLのCASE文を使って列内の各値ごとの合計を1つのクエリで集計する方法
はじめに
MySQLでは、CASE文とSUM関数、GROUP BY句を組み合わせることで、1つの列に含まれる複数の異なる値(この例では評価「1」「2」「3」)の出現回数を、それぞれ個別の列として集計できます。条件に一致した行は「1」、一致しない行は「0」として返し、それを合計することで各値のカウントを求めます。
以下、サンプルテーブルを作成して実際に確認していきましょう。
サンプルテーブルの作成
まず、商品名と商品評価を持つテーブルを作成します。
mysql> create table DemoTable
(
ProductName varchar(100),
ProductRating ENUM('1','2','3')
);
Query OK, 0 rows affected (0.50 sec)テストデータの挿入
INSERTコマンドを使って、いくつかのレコードを挿入します。
mysql> insert into DemoTable values('Product-1',3);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('Product-2',1);
Query OK, 1 row affected (0.08 sec)
mysql> insert into DemoTable values('Product-3',2);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('Product-1',2);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values('Product-3',3);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values('Product-2',2);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values('Product-3',3);
Query OK, 1 row affected (0.10 sec)登録済みレコードの確認
SELECT文ですべてのレコードを表示します。
mysql> select *from DemoTable;
実行結果は以下の通りです。
+-------------+---------------+ | ProductName | ProductRating | +-------------+---------------+ | Product-1 | 3 | | Product-2 | 1 | | Product-3 | 2 | | Product-1 | 2 | | Product-3 | 3 | | Product-2 | 2 | | Product-3 | 3 | +-------------+---------------+ 7 rows in set (0.00 sec)
各評価値ごとの合計を求めるクエリ
ここからが本題です。次のクエリでは、商品評価(ProductRating)をもとに、評価「3」「2」「1」それぞれが何件あるかを、商品名ごとに集計しています。
mysql> select ProductName,
sum( case when ProductRating=3 then 1 else 0 end ) as Product_3_Rating,
sum( case when ProductRating=2 then 1 else 0 end ) as Product_2_Rating,
sum( case when ProductRating=1 then 1 else 0 end ) as Product_1_Rating
from DemoTable
group by ProductName;実行結果は以下の通りです。
+-------------+------------------+------------------+------------------+ | ProductName | Product_3_Rating | Product_2_Rating | Product_1_Rating | +-------------+------------------+------------------+------------------+ | Product-1 | 1 | 1 | 0 | | Product-2 | 0 | 1 | 1 | | Product-3 | 2 | 1 | 0 | +-------------+------------------+------------------+ 3 rows in set (0.00 sec)
クエリの仕組みの解説
- CASE WHEN ProductRating=3 THEN 1 ELSE 0:評価が「3」なら1、それ以外なら0を返します。
- SUM関数:その1と0を合計することで、該当する評価の件数を算出します。
- GROUP BY ProductName:商品名ごとにグループ化し、各商品単位での集計を可能にします。
結果を見ると、たとえば「Product-3」は評価3が2件、評価2が1件、評価1が0件であることが一目でわかります。
まとめ
このように、CASE文をSUM関数の中で使う「条件付き集計(ピボット集計)」のテクニックを活用すれば、複数の値ごとの出現回数を1つのクエリで効率的に取得できます。アンケート集計やレビュー評価の分析など、カテゴリ別の件数を横持ち形式で出力したい場面で非常に役立ちます。
-
MySQLで列の値ごとに「NO」の件数のみをカウントして返すクエリの書き方
MySQLでは、SUM()関数と条件式を組み合わせることで、グループごとに特定の値(この例では「NO」)が出現した回数だけをカウントできます。ここでは、ENUM型のカラムを持つテーブルを例に、「NO」の件数のみを集計する方法を具体的な手順とともに解説します。 1. テーブルを作成する まず、サンプル用のテーブルを作成します。isTopperカラムはENUM型で、「YES」または「NO」のいずれかの値を持ちます。 mysql> create table DemoTable1829 ( Name varchar(
-
MySQLで最初の3件のレコードに特定の値を設定する方法
MySQLで、テーブルの最初の3件のレコードだけに特定の値を設定したい場合は、UPDATE文と組み合わせて LIMIT 3 を使用します。MySQLのUPDATE文は ORDER BY 句と LIMIT 句をサポートしているため、更新対象の行数を簡単に制御できます。ここでは、実際の手順をサンプルコードとともに解説します。 サンプルテーブルの作成 まず、テーブルを作成しましょう。 mysql> create table DemoTable1968 ( Id int NOT NULL AUTO_I