レコードのフィールドの値の合計を求める (SUM 関数の利用)
質問: 列の値の合計値
SQLで列の合計値を求めたいです。SQLで実現できますか?また、その場合どのようなSQL文を記述すればよいですか?
レコードのフィールドの値の合計値を求めるSQLを紹介します。
概要
SQLでレコードのフィールドの合計値を求める場合はSUM関数を利用します。
メモ
レコードのフィールドの値ではなく、レコードの数を求める場合はCOUNT関数を利用します。詳しくは、
こちらの記事を参照してください。
書式
SUM関数の書式は次の通りです。
select SUM((合計を求める列名)) from (テーブル名)
特定の条件に一致するレコードの合計を求める場合の書式です。
select SUM((合計値を求める列名)) from (テーブル名) where (条件式)
特定の列でグループにまとめて集計する場合の書式です。
select SUM((合計値を求める列名)) from (テーブル名) group by (列名)
例1:テーブルのすべてのレコードの合計値を取得する
products テーブル
id | name | price | category |
1 | Penguin | 250 | Bird |
2 | Bear | 1050 | Mammal |
3 | Duck | 150 | Bird |
4 | Camel | 550 | Mammal |
5 | Owl | 185 | Bird |
6 | Whale | 880 | Mammal |
上記のテーブルで"price"の合計を求める場合は以下のSQLを実行します。
select SUM(price) from Products
結果
結果は以下となります。
補足
列名を付ける場合のSQLは以下になります。
select SUM(price) as total from Products
select total=SUM(price) from products
結果は以下となります。
例2:条件に一致したレコードの合計を取得する
products テーブル
id | name | price | category |
1 | Penguin | 250 | Bird |
2 | Bear | 1050 | Mammal |
3 | Duck | 150 | Bird |
4 | Camel | 550 | Mammal |
5 | Owl | 185 | Bird |
6 | Whale | 880 | Mammal |
上記のテーブルでcategoryが"Bird"の合計を求める場合は以下のSQLを実行します。
select SUM(price) from products where category='Bird'
結果
結果は以下となります。
補足
列名を付ける場合のSQLは以下になります。
select SUM(price) as totalfrom products where category='Bird'
または
select total=SUM(price) from products where category='Bird'
結果は以下となります。
例3:group by を用いる場合
group by を用いると指定した列ごとのグループにまとめて、集計することができます。
products テーブル
id | name | price | category |
1 | Penguin | 250 | Bird |
2 | Bear | 1050 | Mammal |
3 | Duck | 150 | Bird |
4 | Camel | 550 | Mammal |
5 | Owl | 185 | Bird |
6 | Whale | 880 | Mammal |
上記のテーブルでcategoryごとの合計を求める場合は以下のSQLを実行します。
select category,SUM(price) as sumvalue from products group by category
結果
結果は以下となります。
category | sumvalue |
Bird | 585 |
Mammal | 2480 |
A.W.S (Another World Story)

五月の午後。ガラス張りの学食は、初夏の光を受けて翡翠色にきらめいていた。
スチームから立ちのぼるカレーの匂いと、遠くのフライヤーが奏でる油のはぜる音が、昼休みのざわめきに溶け込んでいる。
奥の窓際。情報学部二年の悠斗は、トレーを脇に寄せ、ノート PC を開いたまま冷製ラタトゥイユにフォークを突き刺していた。
向かいには、SQL にかけては学年首位の紗季が、味噌カツ丼の上でほくほくと湯気を躍らせながら、彼の画面を覗き込んでいる。
「で、宿題の『レコードの合計』ってやつ、つまずいたんだよな?」
「そう。price フィールドの合計を出したいのに、手打ちで足し算したせいで計算ミスばっかりでさ」悠斗は溜息を混ぜるようにラタトゥイユを咀嚼した。
紗季はカツを一切れぱくりと咥え、タブレットでログを呼び出す。
「もう手計算はやめなよ。こうやって――」
タッチペンが軽やかに走る。
SELECT SUM(price) AS total
FROM lunch_history
WHERE student_id = 19;
「SUM() は『合計』を返す集約関数。引数に列名を渡せば、同じ列の値をぜんぶ足してくれるの。WHERE で絞れば自分の分だけ、GROUP BY を付ければ学年別の合計も一発」
紗季はタッチペンでクエリ実行ボタンを軽やかにタップした。ほどなく、共有DBの実行結果がモニタに浮かぶ。
「先週一週間で14,820円……って、多くない?」
悠斗は目をむいた。
「いつも牛丼並盛しか食べてない気がするんだけど」
紗季は眉根を寄せる。「INSERT した覚えのない高額レコードが紛れてるね。たとえば、この 9999 円の『特盛 A5 近江牛ステーキ定食』とか」
彼女は再びクエリを走らせ、怪しい行を抜き出す。
SELECT *
FROM lunch_history
WHERE price > 2000
AND student_id = 19;
次の瞬間、背後のテーブルから朗らかな笑い声。振り向くと、悠斗のルームメイト・圭太が、スマホを掲げていた。
「よう、バレたか! 学食の POS 端末を実習で触ったとき、冗談でお前の ID で追加しといたんだよ。データベースの罠ってやつ?」
悠斗は思わず椅子を軋ませた。「俺の食費、冗談でインフレさせるな!」
紗季は苦笑しつつも、ペンを指揮棒のように振る。
「じゃあこのレコード、DELETE するね? ――っと、その前に」
彼女は圭太の方へ視線を流し、悪戯っぽく微笑む。
INSERT INTO lunch_history(student_id, menu, price)
VALUES(keita_id, '罰としてアイスクリーム全員分', 300);
「演習用の共有DBだからレジには反映されないけど、課題の総額はキッチリ上がるからね。成績のためにも奢ってもらおうか?」
圭太は肩をすくめ、財布を取り出した。「……せめて GROUP BY で人数割りしてくれよ!」
ホールを駆ける爽やかな笑い声。カツ丼の湯気ができたての雲のように揺れ、窓の外では早緑色の木々がそよいだ。
こうして――SUM で足りないゼロは補えたが、友情の勘定はとっくにプラスがつきすぎて、もはや計算不能だった。
このページのキーワード
- レコードのフィールドの値の合計を取得する (SUM 関数の利用)
著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。