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

MySQLで1つのクエリを使って2つの異なる列をカウントする方法

MySQLで1つのクエリを使って2つの異なる列をカウントする方法

MySQLでは、CASE文を活用することで、1つのクエリ内で2つの異なる列の条件に基づいたカウントを同時に行うことができます。この記事では、具体的なサンプルテーブルを作成しながら、その方法をわかりやすく解説します。

1. サンプルテーブルの作成

まず、動作確認用のテーブルを作成しましょう。以下のクエリを実行して、商品情報を格納するテーブルを定義します。

mysql> create table CountDifferentDemo
    -> (
    -> ProductId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> ProductName varchar(20),
    -> ProductColor varchar(20),
    -> ProductDescription varchar(20)
    -> );
Query OK, 0 rows affected (1.06 sec)

このテーブルは、商品ID(ProductId)、商品名(ProductName)、商品の色(ProductColor)、商品の説明(ProductDescription)の4つの列で構成されています。

2. テストデータの挿入

次に、INSERTコマンドを使ってテーブルにレコードを登録します。以下のクエリを実行してください。

mysql> insert into CountDifferentDemo(ProductName,ProductColor,ProductDescription) values('Product-1','Red','Used');
Query OK, 1 row affected (0.46 sec)
mysql> insert into CountDifferentDemo(ProductName,ProductColor,ProductDescription) values('Product-1','Blue','Used');
Query OK, 1 row affected (0.17 sec)
mysql> insert into CountDifferentDemo(ProductName,ProductColor,ProductDescription) values('Product-2','Green','New');
Query OK, 1 row affected (0.12 sec)
mysql> insert into CountDifferentDemo(ProductName,ProductColor,ProductDescription) values('Product-2','Blue','New');
Query OK, 1 row affected (0.14 sec)
mysql> insert into CountDifferentDemo(ProductName,ProductColor,ProductDescription) values('Product-3','Green','New');
Query OK, 1 row affected (0.21 sec)
mysql> insert into CountDifferentDemo(ProductName,ProductColor,ProductDescription) values('Product-4','Blue','Used');
Query OK, 1 row affected (0.20 sec)

3. 登録データの確認

SELECT文を使って、テーブルに登録されたすべてのレコードを表示してみましょう。

mysql> select *from CountDifferentDemo;

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

+-----------+-------------+--------------+--------------------+
| ProductId | ProductName | ProductColor | ProductDescription |
+-----------+-------------+--------------+--------------------+
|         1 | Product-1   | Red          | Used               |
|         2 | Product-1   | Blue         | Used               |
|         3 | Product-2   | Green        | New                |
|         4 | Product-2   | Blue         | New                |
|         5 | Product-3   | Green        | New                |
|         6 | Product-4   | Blue         | Used               |
+-----------+-------------+--------------+--------------------+
6 rows in set (0.01 sec)

4. 1つのクエリで2つの異なる列をカウントする

ここからが本題です。SUM関数とCASE文を組み合わせることで、商品名ごとに「色がRedである件数」と「説明がNewである件数」を同時にカウントできます。

具体的には、CASE文で条件に一致する場合に1、一致しない場合に0を返し、その結果をSUM関数で合計することで条件別の件数を算出します。

mysql> select ProductName,
    -> SUM(CASE WHEN ProductColor = 'Red' THEN 1 ELSE 0 END) AS Color,
    -> SUM(CASE WHEN ProductDescription = 'New' THEN 1 ELSE 0 END) AS Desciption
    -> from CountDifferentDemo
    -> group by ProductName;

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

+-------------+-------+------------+
| ProductName | Color | Desciption |
+-------------+-------+------------+
| Product-1   |     1 |          0 |
| Product-2   |     0 |          2 |
| Product-3   |     0 |          1 |
| Product-4   |     0 |          0 |
+-------------+-------+------------+
4 rows in set (0.12 sec)

結果の見方

出力結果を確認すると、以下のことがわかります。

  • Product-1:色がRedのレコードが1件、説明がNewのレコードは0件
  • Product-2:色がRedのレコードは0件、説明がNewのレコードが2件
  • Product-3:色がRedのレコードは0件、説明がNewのレコードが1件
  • Product-4:色がRedのレコードは0件、説明がNewのレコードも0件

まとめ

このように、SUM(CASE WHEN 条件 THEN 1 ELSE 0 END) の形式を使えば、GROUP BYと組み合わせることで、1つのクエリだけで複数の異なる条件によるカウントを効率的に集計できます。条件付き集計はレポート作成やダッシュボード開発などでも頻繁に使われるテクニックなので、ぜひ覚えておきましょう。

  1. MySQLで2つの異なる列を組み合わせてカスタムソートを行う方法

    MySQLで2つの列を使ったカスタムソートの実現方法MySQLでは、ORDER BY句とCASE式を組み合わせることで、複数の列に基づいた柔軟なカスタムソートが可能です。まずはサンプル用のテーブルを作成しましょう。1. テーブルの作成mysql> create table DemoTable1610 -> ( -> Marks int, -> Name varchar(20) -> ) ;Query OK, 0 rows affected (0.51 sec)2. レコードの挿入INSERTコマンドを使ってテーブルにデータを登録します。my

  2. MySQLの1つのUPDATE文で2つの列を同時に更新する方法

    はじめにMySQLでは、1つのUPDATE文の中でSET句を一度だけ使えば、複数の列を同時に更新できます。各列の指定はカンマ(,)で区切って記述します。この記事では、実際にテーブルを作成し、1つのクエリで2つの列(FirstNameとLastName)を更新する手順を解説します。サンプルテーブルの作成まず、以下のようにCREATE TABLE文でテーブルを作成します。mysql> create table DemoTable1909 ( Id int NOT NULL, FirstName varchar(20), LastName varchar(20)