レコードのフィールドの値の合計値を求めるSQLを紹介します。
SQLでレコードのフィールドの合計値を求める場合はSUM関数を利用します。
SUM関数の書式は次の通りです。
特定の条件に一致するレコードの合計を求める場合の書式です。
特定の列でグループにまとめて集計する場合の書式です。
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
結果は以下となります。
(列名なし) |
---|
3065 |
列名を付ける場合のSQLは以下になります。
select SUM(price) as total from Products
select total=SUM(price) from products
結果は以下となります。
total |
---|
3065 |
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'
結果は以下となります。
(列名なし) |
---|
585 |
列名を付ける場合のSQLは以下になります。
select SUM(price) as totalfrom products where category='Bird'
または
select total=SUM(price) from products where category='Bird'
結果は以下となります。
total |
---|
585 |
group by を用いると指定した列ごとのグループにまとめて、集計することができます。
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 |
五月の午後。ガラス張りの学食は、初夏の光を受けて翡翠色にきらめいていた。
スチームから立ちのぼるカレーの匂いと、遠くのフライヤーが奏でる油のはぜる音が、昼休みのざわめきに溶け込んでいる。
奥の窓際。情報学部二年の悠斗は、トレーを脇に寄せ、ノート 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 で足りないゼロは補えたが、友情の勘定はとっくにプラスがつきすぎて、もはや計算不能だった。