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を許容しないなどの制約をしておくことが大事です。