MySQLでCOUNT()を使わずに複数のカウントを一度に実行する方法
はじめに
MySQLでは、通常COUNT()関数を使ってレコード数を集計しますが、条件ごとに複数のカウントを行いたい場合は、SUM()とCASE文を組み合わせる方法が便利です。この記事では、実際のテーブル作成から集計クエリまで、手順を追って解説します。
1. サンプルテーブルを作成する
まず、以下のコマンドでテーブルを作成します。
mysql> create table DemoTable1485
-> (
-> StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> StudentName varchar(20),
-> StudentSubject varchar(20)
-> );
Query OK, 0 rows affected (0.72 sec)
このテーブルは、学生ID(自動採番の主キー)、学生名、履修科目の3つのカラムを持っています。
2. テーブルにデータを挿入する
次に、INSERTコマンドを使ってサンプルデータを登録します。
mysql> insert into DemoTable1485(StudentName,StudentSubject) values('Chris','MySQL');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable1485(StudentName,StudentSubject) values('Robert','MongoDB');
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable1485(StudentName,StudentSubject) values('Robert','MongoDB');
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable1485(StudentName,StudentSubject) values('Chris','Java');
Query OK, 1 row affected (0.12 sec)3. 登録したデータを確認する
SELECT文ですべてのレコードを表示してみましょう。
mysql> select * from DemoTable1485;
実行結果は以下のとおりです。
+-----------+-------------+----------------+
| StudentId | StudentName | StudentSubject |
+-----------+-------------+----------------+
| 1 | Chris | MySQL |
| 2 | Robert | MongoDB |
| 3 | Robert | MongoDB |
| 4 | Chris | Java |
+-----------+-------------+----------------+
4 rows in set (0.00 sec)
4. COUNT()を使わずに複数のカウントを実行する
ここが本題です。SUM()の中でCASE文を使い、条件に一致するレコードを「1」、一致しないレコードを「0」として合計することで、条件別のカウントを実現できます。さらにGROUP BYで科目ごとにグループ化すれば、科目別・学生別のクロス集計が一度のクエリで可能になります。
mysql> select StudentSubject,
-> sum(case when StudentName = 'Chris' THEN 1 ELSE 0 END) Chris_Count,
-> sum(case when StudentName = 'Robert' THEN 1 ELSE 0 END) Robert_Count
-> from DemoTable1485
-> group by StudentSubject;
実行結果は以下のとおりです。
+----------------+-------------+--------------+
| StudentSubject | Chris_Count | Robert_Count |
+----------------+-------------+--------------+
| MySQL | 1 | 0 |
| MongoDB | 0 | 2 |
| Java | 1 | 0 |
+----------------+-------------+--------------+
3 rows in set (0.00 sec)
まとめ
上記の結果から、MySQLはChrisが1件、MongoDBはRobertが2件、JavaはChrisが1件というように、科目ごとの学生別カウントが一目でわかります。この手法はCOUNT(CASE WHEN ... THEN 1 END)として書くこともでき、ピボットテーブルのような集計や、複数条件の同時集計が必要なレポート作成などで非常に役立ちます。ぜひ活用してみてください。
-
mysqldumpを使わずにMySQLデータベースを複製する方法
MySQLデータベースを複製する場合、通常はmysqldumpコマンドが使われますが、SQL文だけでテーブルを別のデータベースへコピーすることも可能です。ここでは、CREATE TABLE ... SELECT構文を使った複製方法を解説します。複製に使う基本構文あるデータベースのテーブルを、別のデータベースにそのままコピーしたい場合は、以下の構文を使用します。create table データベース名1.テーブル名1 select * from データベース名2.テーブル名2;この構文では、元のテーブル(データベース名2.テーブル名2)の全データとカラム定義をもとに、新しいテーブル(データベース
-
MySQLで複数のテーブルの行数(COUNT(*))を1つのクエリで取得する方法
MySQLでは、サブクエリを組み合わせることで、複数のテーブルの行数を1つのクエリで同時に取得できます。基本となる構文は以下の通りです。SELECT (SELECT COUNT(*) FROM テーブル名1) AS エイリアス名1, (SELECT COUNT(*) FROM テーブル名2) AS エイリアス名2 FROM dual;構文のポイント各テーブルに対して COUNT(*) を含むスカラーサブクエリを作成し、それらを SELECT 句の中に並べます。MySQLでは FROM dual を指定することで、実際のテーブルを参照しないままサブクエリを評価できます(なお、My