SQLのsum関数についてまとめています。sum関数は、対象の列をすべて加算・集計する関数です。
SQL sumの構文
もっともシンプルなsum関数の使い方は以下の通り。salaries(年収)テーブルから、salary(年収)をすべて集計する例です。
mysql> SELECT sum(salary) FROM `salaries`; +--------------+ | sum(salary) | +--------------+ | 181480757419 | +--------------+ 1 row in set (1.42 sec)
しかし、sum関数は単独で使用することはあまりありません。group byを指定して、グルーピングごとの小計を計算するために使用するのが一般的です。
複数テーブルをgroup byでグルーピングしてsumで集計
以下は、group byと組み合わせたsumの使用例です。部署名(dept_name)ごとの社員の年収を小計しています。社員データ、年収データ、部署データは複数のテーブルに分かれているため、joinでテーブル結合をおこなって集計しています。salaries.to_date=’9999-01-01’という条件は、現在在籍中の社員を絞り込むための条件です。
select departments.dept_name, sum(salary) from employees inner join salaries on salaries.emp_no = employees.emp_no inner join dept_emp on employees.emp_no = dept_emp.emp_no inner join departments on dept_emp.dept_no = departments.dept_no where salaries.to_date = '9999-01-01' group by dept_name; +--------------------+-------------+ | dept_name | sum(salary) | +--------------------+-------------+ | Customer Service | 1270982348 | | Development | 4627787365 | | Finance | 1089231961 | | Human Resources | 909717009 | | Marketing | 1300398678 | | Production | 3982729442 | | Quality Management | 1045459198 | | Research | 1148334609 | | Sales | 3731370677 | +--------------------+-------------+ 9 rows in set (4.86 sec)
【関連記事】
▶SQL sumのサンプルコード集 基本の小計出力から、NULL対策まで
複数の列をsumで集計
sum関数は、同時に複数指定使用可能です。以下は、score_tableテーブルの、first_score、second_score、third_scoreをそれぞれsumで集計するSQLです。
mysql> SELECT SUM(first_score), SUM(second_score), SUM(third_score) FROM score_table; +------------------+-------------------+-------------------+ | SUM(first_score) | SUM(second_score) | SUM(third_score) | +------------------+-------------------+-------------------+ | 335 | 385 | 345 | +------------------+-------------------+-------------------+ 1 row in set (0.01 sec)
【関連記事】
▶【SQL】列や行の合計を求める方法をサンプル付きでていねいに解説!
SQLとover句で累計と小計を同時に求める
sum関数にover句を指定すると、指定した項目での小計を求めることができます。over句に何も指定しない場合は、グルーピングしていない全体の累計を求めることができます。
以下のSQLは、sales(売上)テーブルから、年、句に、製品、売上(profit)、total_profit(全体の累計)、country_profit(国ごとの売上小計)を抽出するSQLです。
mysql> SELECT year, country, product, profit, SUM(profit) OVER() AS total_profit, SUM(profit) OVER(PARTITION BY country) AS country_profit FROM sales ORDER BY country, year, product, profit; +------+---------+------------+--------+--------------+----------------+ | year | country | product | profit | total_profit | country_profit | +------+---------+------------+--------+--------------+----------------+ | 2000 | Finland | Computer | 1500 | 7535 | 1610 | | 2000 | Finland | Phone | 100 | 7535 | 1610 | | 2001 | Finland | Phone | 10 | 7535 | 1610 | | 2000 | India | Calculator | 75 | 7535 | 1350 | | 2000 | India | Calculator | 75 | 7535 | 1350 | | 2000 | India | Computer | 1200 | 7535 | 1350 | | 2000 | USA | Calculator | 75 | 7535 | 4575 | | 2000 | USA | Computer | 1500 | 7535 | 4575 | | 2001 | USA | Calculator | 50 | 7535 | 4575 | | 2001 | USA | Computer | 1200 | 7535 | 4575 | | 2001 | USA | Computer | 1500 | 7535 | 4575 | | 2001 | USA | TV | 100 | 7535 | 4575 | | 2001 | USA | TV | 150 | 7535 | 4575 | +------+---------+------------+--------+--------------+----------------+
関連)MySQL :: MySQL 8.0 Reference Manual :: 12.21.2 Window Function Concepts and Syntax
まとめ
- sumは、対象の列を加算・合計する集計関数
- sumは複数の列、複数のテーブルを対象にグルーピング集計が可能
- sumとover句を組み合わせるとグループ小計と全体の累計を同時に集計可能