取得したデータの最大値を求める関数の使い方~MAX集約関数 select~

MySQL

SQLにもExcelのようにデータを操作する関数があります。今回はデータの最大値を取得するMAX集約関数について紹介していきます。

部長
部長

12月で一番高い買い物をしたお客さんを知りたいなあ

平社員
平社員

はーい

前提条件

商品の売り上げを管理しているテーブルから指定した月の最大値を取得する

使用するテーブル: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カラムの日付が12月のものを取得する
  • 12月の商品の売り上げの最大値を計算する

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

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

コードの見方

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

出力結果

+------+---------+--------+---------------------+
| 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 |
+------+---------+--------+---------------------+
3 rows in set (0.001 sec)

3つのレコードが取得できたので売り上げの最大値を計算していきます。

取得したデータの最大値を取得する

構文

select max(最大値を取得するカラム名) from orders where 条件;

使用するSQL文

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

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

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

出力結果

+-------------+
| max(amount) |
+-------------+
|        6000 |
+-------------+
1 row in set (0.001 sec)

12月の売り上げの最大金額の単価が表示されました。

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をコピーしました