導入:なぜ合計関数の使い分けが重要か
データベース管理の現場において、売上集計や在庫計算といった「合計値」を算出するクエリは非常に頻繁に使用されます。SQLiteには合計値を求める関数としてsumとtotalの2種類が存在しますが、これらは単に同じ計算を行うわけではありません。特にNULL値の扱いや戻り値の型が異なるため、アプリケーション側でのデータ処理において予期せぬバグを引き起こす可能性があります。本稿では、実務で迷わないための両者の違いと適切な使い分けについて解説します。
基礎知識:sumとtotalの仕組み
sum関数とtotal関数は、共に指定したカラムの値を加算する集計関数です。
sum関数は、数学的に自然な振る舞いをします。対象データが全てNULLであれば結果もNULLとなり、計算結果の型も入力値の型(整数なら整数)を維持しようとします。
一方、total関数は「常に数値として結果を返す」という特徴があります。対象がNULLであっても0.0を返し、戻り値も常に浮動小数点数(REAL型)となります。
実装/解決策:現場での判断基準
実務における判断基準は「計算結果をどのように利用するか」にあります。
・計算結果をUIに表示する際、NULLを0として扱いたい場合はtotal関数が便利です。
・厳密な数値管理や、後続の計算で型の整合性を重視する場合はsum関数を使用し、必要に応じてCOALESCE関数でNULLを補完するのが定石です。
サンプルプログラム
以下のコードは、テーブル作成からデータ挿入、そして両関数の挙動を比較するためのSQLスクリプトです。
— 1. テスト用テーブルの作成
CREATE TABLE sales_data (
shop_name TEXT,
amount REAL
);
— 2. NULLを含むデータを挿入
INSERT INTO sales_data VALUES (‘Tokyo’, NULL);
INSERT INTO sales_data VALUES (‘Osaka’, 100);
— 3. 挙動の確認クエリ
— sumはNULLを返し、totalは0.0を返すことを確認
SELECT
sum(amount) AS sum_result,
total(amount) AS total_result
FROM sales_data;
— 4. 整数のみのデータで型の違いを確認
— sumは整数(100)、totalは浮動小数点数(100.0)を返す
SELECT
sum(amount),
total(amount)
FROM sales_data WHERE amount IS NOT NULL;
応用・注意点:現場で陥りやすい罠
現場で最も注意すべき点は、「戻り値の型」です。アプリケーション側で厳密な型チェックを行っている場合、sum関数が整数を返していたのに、ある時データに浮動小数点数が混入したことで、突如として浮動小数点数が返されるようになり、予期せぬキャストエラーや計算誤差が発生することがあります。
また、sum関数でNULLを0にしたい場合は、以下の書き方が標準的です。
SELECT COALESCE(sum(amount), 0) FROM sales_data;
この書き方であれば、sum関数の論理的な正確さを保ちつつ、アプリケーション側でのNULLハンドリングを簡略化できます。プロジェクトのコーディング規約に合わせて、どちらを採用するかチーム内で統一しておくことを強く推奨します。

コメント