MySQLでSUM関数を使用して数値の合計を計算する際、浮動小数点数やDECIMAL型のカラムを扱うと、意図しない多くの小数点以下の桁数が返されることがあります。本記事では、このようなケースで結果を適切に丸めたり、桁数を調整する方法について解説します。
SUM関数の基本的な挙動
SUM関数は指定したカラムの値を合計しますが、元のデータ型に応じて結果の精度が異なります。例えば、以下のようなテーブルがあるとします。
CREATE TABLE product_sales (
id INT PRIMARY KEY,
price DECIMAL(10, 4),
quantity INT
);
INSERT INTO product_sales VALUES
(1, 199.9950, 10),
(2, 299.9925, 5),
(3, 99.9975, 20);
このテーブルで単純にSUMを実行すると、以下のような結果になります。
SELECT SUM(price) AS total_price FROM product_sales;
-- 結果: 599.9850
場合によっては、この結果を特定の桁数に丸める必要があります。
ROUND関数による四捨五入
最も一般的な方法はROUND関数を使用することです。第二引数で小数点以下の桁数を指定できます。
SELECT ROUND(SUM(price), 2) AS rounded_total FROM product_sales;
-- 結果: 599.99
負の値を指定すると、整数部の桁で丸めることも可能です。
SELECT ROUND(SUM(price), -1) AS rounded_total FROM product_sales;
-- 結果: 600
CEIL関数とFLOOR関数による切り上げ・切り捨て
常に整数で結果を取得したい場合、CEIL(切り上げ)またはFLOOR(切り捨て)を使用します。
SELECT CEIL(SUM(price)) AS ceiling_total FROM product_sales;
-- 結果: 600
SELECT FLOOR(SUM(price)) AS floor_total FROM product_sales;
-- 結果: 599
TRUNCATE関数による単純な切り捨て
ROUND関数は四捨五入を行いますが、単に指定桁数以降を切り捨てたい場合はTRUNCATE関数が適しています。
SELECT TRUNCATE(SUM(price), 2) AS truncated_total FROM product_sales;
-- 結果: 599.98
FLOORとの違いは、小数点以下の桁数を保持する点です。金額計算で厳密な切り捨てが必要な場合に有用です。
FORMAT関数による表示形式の制御
結果を文字列として整形し、3桁区切りで表示したい場合はFORMAT関数を使用します。
SELECT FORMAT(SUM(price), 2) AS formatted_total FROM product_sales;
-- 結果: '599.99'
ただし、FORMAT関数は文字列型を返すため、数値計算に結果を使用する場合は注意が必要です。
各関数の比較まとめ
以下のフローチャートは、目的に応じた適切な関数の選択フローを示しています。
flowchart TD
A[SUM結果の小数点処理] --> B{どのような丸め処理が必要か?}
B -->|四捨五入| C[ROUND関数]
B -->|切り上げ| D[CEIL関数]
B -->|切り捨て| E{小数を残すか?}
B -->|表示用| F[FORMAT関数]
E -->|はい| G[TRUNCATE関数]
E -->|いいえ| H[FLOOR関数]
実用例として、売上レポートで金額を適切に表示するクエリを示します。
SELECT
COUNT(*) AS order_count,
TRUNCATE(SUM(price), 2) AS total_sales,
ROUND(AVG(price), 2) AS average_price
FROM product_sales;
このように、用途に応じて適切な関数を選択することで、ビジネス要件に合った精度で結果を取得できます。