MySQLで特定の値を持つ列の数をカウントする方法【SUM関数の活用】
はじめに
MySQLでは、SUM関数と加算演算子(+)・論理演算子(AND)を組み合わせることで、テーブル内の複数の列に含まれる特定の値(たとえば「1」)の合計個数や、すべての列がその値を持つ行数を簡単に集計できます。
本記事では、サンプルテーブルを作成しながら、具体的なSQLクエリの書き方と実行結果をわかりやすく解説します。
基本構文
特定の値を持つ列の数をカウントする場合、以下のような構文を使用します。
select
sum(yourColumnName1 + yourColumnName2 + yourColumnName3 ... N) as `anyAliasName1`,
sum(yourColumnName1 and yourColumnName2 and yourColumnName3 .... N) as anyAliasName
from yourTableName;
この構文のポイントは次の2点です。
- sum(列A + 列B + 列C):各行ごとに列の値を足し合わせ、さらに全行分の総和を返します。つまり、テーブル全体で「1」が合計いくつ存在するかを数えられます。
- sum(列A and 列B and 列C):各行に対してAND演算を行うため、すべての列が真(1)である行だけが1としてカウントされます。結果として、「すべての列が1になっている行の件数」を取得できます。
サンプルテーブルの作成
まず、動作確認用のテーブルを作成しましょう。
mysql> create table demo36
-> (
-> id int not null auto_increment primary key,
-> value1 int,
-> value2 int,
-> value3 int
-> );
Query OK, 0 rows affected (1.68 sec)
ここでは、自動採番される id を主キーとし、集計対象となる value1〜value3 の3つのint型列を定義しています。
レコードの挿入
INSERTコマンドを使って、テスト用のデータを数件登録します。
mysql> insert into demo36(value1,value2,value3) values(1,0,0);
Query OK, 1 row affected (0.14 sec)
mysql> insert into demo36(value1,value2,value3) values(1,0,1);
Query OK, 1 row affected (0.11 sec)
mysql> insert into demo36(value1,value2,value3) values(1,1,1);
Query OK, 1 row affected (0.22 sec)
mysql> insert into demo36(value1,value2,value3) values(0,1,0);
Query OK, 1 row affected (0.12 sec)
mysql> insert into demo36(value1,value2,value3) values(1,1,0);
Query OK, 1 row affected (0.10 sec)
登録データの確認
SELECT文でテーブルの中身を表示して、データが正しく登録されているか確認します。
mysql> select *from demo36;
実行すると、次のような結果が出力されます。
+----+--------+--------+--------+
| id | value1 | value2 | value3 |
+----+--------+--------+--------+
| 1 | 1 | 0 | 0 |
| 2 | 1 | 0 | 1 |
| 3 | 1 | 1 | 1 |
| 4 | 0 | 1 | 0 |
| 5 | 1 | 1 | 0 |
+----+--------+--------+--------+
5 rows in set (0.00 sec)
特定の値を持つ列の数をカウントするクエリ
それでは、MySQLで特定の値(ここでは「1」)を持つ列の数をカウントするクエリを実行してみましょう。
mysql> select
-> sum(value1+value2+value3) as `Total_Number_Of_1`,
-> sum(value1 and value2 and value3) as `Total_Number_Of_Rows_With_1`
-> from demo36;
実行結果
上記クエリを実行すると、次の出力が得られます。
+-------------------+-----------------------------+
| Total_Number_Of_1 | Total_Number_Of_Rows_With_1 |
+-------------------+-----------------------------+
| 9 | 1 |
+-------------------+-----------------------------+
1 row in set (0.00 sec)
結果の解説
- Total_Number_Of_1 = 9:各行の value1〜value3 の値を足し合わせた合計です。「1」は value1 に4個、value2 に3個、value3 に2個存在するため、全体で9個となります。
- Total_Number_Of_Rows_With_1 = 1:AND演算により、3つの列がすべて「1」である行のみがカウントされます。該当するのは id=3 の行だけなので、結果は1件です。
まとめ
SUM関数に加算演算子を使えば「特定の値が全体で何個あるか」を、論理演算子ANDを使えば「すべての列が条件を満たす行が何件あるか」を、それぞれ1つのクエリで効率的に集計できます。フラグ管理のテーブルなど、0/1の値を扱う場面で特に役立つテクニックなので、ぜひ活用してみてください。
-
JavaでMySQLテーブルのカラム数を取得・カウントする方法
MySQLテーブルのカラム(列)数をJavaで取得するには、ResultSetMetaDataインターフェースを使用します。ResultSetMetaDataを活用すれば、カラムの総数だけでなく、各カラムの名前やデータ型といった詳細情報も簡単に取得できます。前提:サンプルテーブルの作成まずは動作確認用のテーブルを作成しましょう。以下のSQLでは、3つのカラムを持つ「DemoTable」を作成しています。mysql> create table DemoTable -> ( -> St
-
MySQLで特定の値より大きいレコードだけを抽出する方法|WHERE句を使った条件指定の基本
MySQLで特定の値以下のレコードを除外するには? MySQLである値を基準に、それより小さいレコードを除外し、大きい値を持つレコードだけを取得したい場合は、WHERE句に比較演算子「>(より大きい)」を組み合わせるのが基本です。 基本構文 SELECT * FROM テーブル名 WHERE カラム名 > 値; この構文により、指定したカラムの値が条件値より大きい行のみが結果セットとして返されます。 実際に試してみよう:サンプルテーブルの作成 まずは動作を確認するためのテーブルを作成します。 mysql> create table demo27 -> ( ->