取得したデータの合計を求める関数の使い方~SUM集約関数 select~

MySQL

SQLにもExcelのようにデータを操作する関数があります。今回はデータを合計するSUM集約関数について紹介していきます。

前提条件

商品の売り上げを管理しているテーブルから指定した月の売り上げを計算する

使用するテーブル:ordersテーブル

+------+---------+--------+---------------------+
| id   | user_id | amount | order_time          |
+------+---------+--------+---------------------+
|    1 |       2 |   6000 | 2030-12-31 11:00:00 |
|    2 |       6 |   2000 | 2030-12-25 18:30:00 |
|    3 |       1 |   3000 | 2030-12-10 10:00:00 |
|    4 |       4 |   2500 | 2030-11-01 20:15:00 |
|    5 |       3 |   4000 | 2030-11-30 09:45:00 |
|    6 |       5 |   3600 | 2030-10-15 23:30:00 |
+------+---------+--------+---------------------+
6 rows in set (0.000 sec)

条件

  • order_timeカラムの日付が11月のものを取得する
  • 11月の商品の売り上げを合計する

11月のデータ一覧を取得するSQL

select * from orders 
where 
order_time >= '2030-11-01 00:00:00' 
and 
order_time < '2030-12-01 00:00:00';

コードの見方

青文字・・・省略できない決まり文句
紫文字・・・コメント
白文字・・・利用者の任意で入力する文字列

出力結果

+------+---------+--------+---------------------+
| id   | user_id | amount | order_time          |
+------+---------+--------+---------------------+
|    4 |       4 |   2500 | 2030-11-01 20:15:00 |
|    5 |       3 |   4000 | 2030-11-30 09:45:00 |
+------+---------+--------+---------------------+
2 rows in set (0.000 sec)

二つのレコードが取得できたので売り上げを合計していきます。

取得したデータの合計を計算する

構文

select sum(合計するカラム名) from orders where 条件;

使用するSQL文

select sum(amount) from orders 
where 
order_time >= '2030-11-01 00:00:00' 
and 
order_time < '2030-12-01 00:00:00';

今回は合計金額を出すのでカラム名はamountを指定します。

条件は11月を指定しています。

出力結果

+-------------+
| sum(amount) |
+-------------+
|        6500 |
+-------------+
1 row in set (0.004 sec)

11月の売り上げの合計金額が表示されました。

Nullに注意!

カラムの値がNullとなっていた場合には計算されません。

例えば、

12月の売り上げが3つあったとします。

今回は合計金額を出すのではなく平均金額を例にしていきます。

+------+---------+--------+---------------------+
| id   | user_id | amount | order_time          |
+------+---------+--------+---------------------+
|    1 |       2 |   6000 | 2030-12-31 11:00:00 |
|    2 |       6 |        | 2030-12-25 18:30:00 |
|    3 |       1 |   3000 | 2030-12-10 10:00:00 |
+------+---------+--------+---------------------+
3 rows in set (0.001 sec)

idが1と3の売り上げには値が入っていますが、idが2の売り上げには値が入っていません。

この場合の計算式は以下になります。

(6000 + 3000) ÷ 2 = 4500

以下のような計算式にはならない

× (6000 + 3000) ÷ 3 = 3000

計算するカラムに値の入っていないレコードがあると客数に対して計算結果が合わないなどのトラブルが発生します。

これはほかの集約関数を利用した場合にも同様です。

Nullは0を表しているのではなく、値そのものがないので計算にも反映されません。

データベースの設計時点からNullを許容しないなどの制約をしておくことが大事です。

タイトルとURLをコピーしました