MySQLのSUM()関数を使って列の重複しない値だけの合計を計算する方法
MySQLのSUM()関数とDISTINCTキーワードの組み合わせ
MySQLでは、列に含まれる重複しない値(異なる値)のみの合計を計算したい場合、SUM()関数の中で「DISTINCT」キーワードを列名と一緒に使用します。通常のSUM()関数はすべての行の値を合計しますが、DISTINCTを指定することで、同じ値は1回だけカウントされるようになります。
サンプルテーブルの確認
ここでは、以下のようなレコードを持つ「employee_tbl」テーブルを例に考えてみましょう。
mysql> SELECT * FROM employee_tbl; +------+------+------------+--------------------+ | id | name | work_date | daily_typing_pages | +------+------+------------+--------------------+ | 1 | John | 2007-01-24 | 250 | | 2 | Ram | 2007-05-27 | 220 | | 3 | Jack | 2007-05-06 | 170 | | 3 | Jack | 2007-04-06 | 100 | | 4 | Jill | 2007-04-06 | 220 | | 5 | Zara | 2007-06-06 | 300 | | 5 | Zara | 2007-02-06 | 350 | +------+------+------------+--------------------+ 7 rows in set (0.00 sec)
DISTINCTを使った合計の計算方法
上記のテーブルをもとに、daily_typing_pages列の重複しない値だけを合計したい場合は、次のようにクエリを実行します。
mysql> SELECT SUM(DISTINCT daily_typing_pages)
-> FROM employee_tbl;
+-------------------------+
| SUM(daily_typing_pages) |
+-------------------------+
| 1390 |
+-------------------------+
1 row in set (0.00 sec)
結果の解説
この結果セットを見ると、DISTINCTキーワード付きのMySQL SUM()関数は、重複していないレコードのみを合計していることがわかります。具体的には、テーブル内に「220」という値が2回出現しています(RamとJillのレコード)が、DISTINCTを指定したことで「220」は1回だけ加算されています。
参考までに、DISTINCTなしで単純に合計すると「1610(250 + 220 + 170 + 100 + 220 + 300 + 350)」となりますが、DISTINCTを使用した場合は「1390(250 + 220 + 170 + 100 + 300 + 350)」という結果になります。このように、SUM(DISTINCT 列名)を使うことで、ユニークな値のみの合計を簡単に求めることができます。
-
MySQLで特定の3つの値しか格納できないカラムを持つテーブルを作成する方法
MySQLで、あらかじめ決められた3つの値だけを格納できるカラムを持つテーブルを作成したい場合は、ENUMデータ型を使用します。ENUM型を使うと、指定した候補値以外のデータが挿入されるのを防ぐことができます。テーブルの作成まず、ENUM型のカラムを持つテーブルを作成しましょう。ここでは例として、「RED」「GREEN」「BLUE」の3色のみを許可するColorカラムを定義します。mysql> create table DemoTable838(Color ENUM(RED,GREEN,BLUE)); Query OK, 0 rows affected (0.67 sec)これで、Col
-
MySQLのWHERE句でSUM()関数の結果は使用できる?HAVING句を使った正しい書き方を解説
MySQLでは、SUM()などの集計関数の結果をWHERE句で直接使用することはできません。これは、WHERE句がグループ化の前に行単位で評価されるためです。代わりに、GROUP BYと組み合わせたHAVING句を使うことで、集計結果に基づいた絞り込みが可能になります。 ここからは、実際にサンプルテーブルを作成しながら手順を確認していきましょう。 1. サンプルテーブルの作成 まず、名前と価格を持つテーブルを作成します。 mysql> create table DemoTable ( Name varchar(50), Price int ); Query OK, 0