MySQLのSUM関数で小数点以下の桁数を制御する方法

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;

このように、用途に応じて適切な関数を選択することで、ビジネス要件に合った精度で結果を取得できます。

タグ: MySQL SQL SUM関数 ROUND関数 データ型

6月17日 22:57 投稿