導入
データベース運用において、売上金額や在庫数など、特定のカラムの総計を求めるケースは日常的に発生します。アプリケーション側でループ処理を回して集計を行うのはメモリとCPUの無駄であり、パフォーマンス低下の大きな要因となります。MySQLのSUM関数を活用すれば、データベースエンジン側で高速かつ簡潔に集計を行うことが可能です。本記事では、実務で頻出する集計手法と、注意すべきポイントを解説します。
基礎知識
SUM関数は、指定したカラムの値をすべて加算して返す「集計関数(Aggregate Function)」の一つです。引数にはカラム名を指定します。特徴として、集計対象の値がNULLである場合、その行は無視され、加算には影響しません。また、DISTINCTキーワードを併用することで、重複を除外した値のみを合計対象にすることも可能です。
実装/解決策
実務では単なる全合計だけでなく、特定の属性ごとに内訳を出したい場面がほとんどです。これにはGROUP BY句を組み合わせます。グループ化を行うことで、部署別、月別、商品カテゴリ別といった精緻な分析データがSQL一発で取得できるようになります。
サンプルプログラム
以下のコードは、果物販売テーブルを作成し、商品ごとの合計売上を取得する実例です。MySQL環境で実行可能です。
— テーブルの作成
CREATE TABLE fruit (name VARCHAR(10), sales INT);
— サンプルデータの挿入
INSERT INTO fruit VALUES (‘Apple’, 240), (‘Orange’, 180), (‘Grape’, 350), (‘Apple’, 190), (‘Orange’, 200), (‘Apple’, 250);
— 1. テーブル全体の売上合計を取得
SELECT SUM(sales) AS total_sales FROM fruit;
— 2. 商品名ごとにグループ化して売上合計を取得
— GROUP BYを使うことで、カテゴリ別の集計が可能になります
SELECT name, SUM(sales) AS category_total
FROM fruit
GROUP BY name;
— 3. 重複を除外した合計値を取得(例:異なる販売機会でも同じ価格は一度のみカウントする場合)
SELECT SUM(DISTINCT sales) AS distinct_total FROM fruit;
応用・注意点
現場でSUM関数を扱う際、特に注意すべきは以下の2点です。
1. 空のテーブルに対する挙動:対象となるデータが一件も存在しない場合、SUM関数は0ではなくNULLを返します。アプリケーション側で計算結果を表示する際、NULLを0として扱う必要がある場合は、IFNULL(SUM(sales), 0)のように記述してゼロ埋めする癖をつけておきましょう。
2. データ型のオーバーフロー:合計値がカラムのデータ型の許容範囲を超えるとエラーが発生します。大規模なテーブルを扱う際は、設計段階で結果を保持する型のサイズに十分な余裕を持たせることが重要です。
これらを意識するだけで、レポート機能や分析クエリの信頼性が格段に向上します。ぜひ業務で活用してください。

コメント