レコードのフィールドの値の合計を求める (SUM 関数の利用)

しゃみなー
質問: 列の値の合計値
SQLで列の合計値を求めたいです。SQLで実現できますか?また、その場合どのようなSQL文を記述すればよいですか?
レコードのフィールドの値の合計値を求めるSQLを紹介します。

概要

SQLでレコードのフィールドの合計値を求める場合はSUM関数を利用します。
メモ
レコードのフィールドの値ではなく、レコードの数を求める場合はCOUNT関数を利用します。詳しくは、こちらの記事を参照してください。

書式

SUM関数の書式は次の通りです。
select SUM((合計を求める列名)) from (テーブル名)

特定の条件に一致するレコードの合計を求める場合の書式です。
select SUM((合計値を求める列名)) from (テーブル名) where (条件式)
特定の列でグループにまとめて集計する場合の書式です。
select SUM((合計値を求める列名)) from (テーブル名) group by (列名)

例1:テーブルのすべてのレコードの合計値を取得する

products テーブル
idnamepricecategory
1Penguin250Bird
2Bear1050Mammal
3Duck150Bird
4Camel550Mammal
5Owl185Bird
6Whale880Mammal

上記のテーブルで"price"の合計を求める場合は以下のSQLを実行します。
select SUM(price) from Products

結果

結果は以下となります。
(列名なし)
3065

補足

列名を付ける場合のSQLは以下になります。
select SUM(price) as total from Products
select total=SUM(price) from products 

結果は以下となります。
total
3065

例2:条件に一致したレコードの合計を取得する

products テーブル
idnamepricecategory
1Penguin250Bird
2Bear1050Mammal
3Duck150Bird
4Camel550Mammal
5Owl185Bird
6Whale880Mammal

上記のテーブルでcategoryが"Bird"の合計を求める場合は以下のSQLを実行します。
select SUM(price) from products where category='Bird'

結果

結果は以下となります。
(列名なし)
585

補足

列名を付ける場合のSQLは以下になります。
select SUM(price) as totalfrom products where category='Bird'
または
select total=SUM(price) from products where category='Bird'

結果は以下となります。
total
585

例3:group by を用いる場合

group by を用いると指定した列ごとのグループにまとめて、集計することができます。
products テーブル
idnamepricecategory
1Penguin250Bird
2Bear1050Mammal
3Duck150Bird
4Camel550Mammal
5Owl185Bird
6Whale880Mammal

上記のテーブルでcategoryごとの合計を求める場合は以下のSQLを実行します。
select category,SUM(price) as sumvalue from products group by category

結果

結果は以下となります。
categorysumvalue
Bird585
Mammal2480

A.W.S (Another World Story)

レコードのフィールドの値の合計を求める (SUM 関数の利用):画像1
五月の午後。ガラス張りの学食は、初夏の光を受けて翡翠色にきらめいていた。 スチームから立ちのぼるカレーの匂いと、遠くのフライヤーが奏でる油のはぜる音が、昼休みのざわめきに溶け込んでいる。

奥の窓際。情報学部二年の悠斗は、トレーを脇に寄せ、ノート PC を開いたまま冷製ラタトゥイユにフォークを突き刺していた。 向かいには、SQL にかけては学年首位の紗季が、味噌カツ丼の上でほくほくと湯気を躍らせながら、彼の画面を覗き込んでいる。

「で、宿題の『レコードの合計』ってやつ、つまずいたんだよな?」
「そう。price フィールドの合計を出したいのに、手打ちで足し算したせいで計算ミスばっかりでさ」悠斗は溜息を混ぜるようにラタトゥイユを咀嚼した。

紗季はカツを一切れぱくりと咥え、タブレットでログを呼び出す。
「もう手計算はやめなよ。こうやって――」
タッチペンが軽やかに走る。
SELECT SUM(price) AS total
FROM lunch_history
WHERE student_id = 19;

「SUM() は『合計』を返す集約関数。引数に列名を渡せば、同じ列の値をぜんぶ足してくれるの。WHERE で絞れば自分の分だけ、GROUP BY を付ければ学年別の合計も一発」
紗季はタッチペンでクエリ実行ボタンを軽やかにタップした。ほどなく、共有DBの実行結果がモニタに浮かぶ。
total 14820
「先週一週間で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 関数の利用)
AuthorPortraitAlt
著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。
作成日: 2014-07-28
Copyright © 1995–2025 iPentec all rights reserverd.