3秒でわかる
集約とは、ばらばらの複数データをまとめること。ITでは主に、多数の値から合計・平均・件数など少数の結果を作る処理を指し、UMLでは別の意味を持ちます。
30秒図解
もう少し詳しく
まず「集約」の意味を分ける
「集約」は、使われる文脈によって指すものが変わります。
| 文脈 | 意味 | 例 |
|---|---|---|
| 一般的な日本語 | ばらばらのものを一か所へまとめる | 情報を一つの資料へ集約する |
| データ処理 | 複数の行や値から、少数の結果を作る | 売上の合計、平均、件数を出す |
| UML・オブジェクト設計 | 全体と部分の「持っている」関係を表す | チームが選手を持つ |
プログラミングやSQLの説明で単に「集約する」と書かれていたら、多くの場合はデータ処理の集約です。このページもデータ処理を中心に説明し、後半でUMLの集約との違いを整理します。
データ処理の集約とは
データ処理の集約(aggregation)とは、複数の行や要素をまとめて、判断しやすい少数の結果へ変換する操作です。10件の売上から合計を1個作る、100人分の点数から平均を1個作る、といった「多から少へ」の変換が集約です。
SQLでは SUM、AVG、COUNT、MAX、MIN などの集約関数を使います。Pythonなら sum() や max()、JavaScriptなら reduce() が同じ役割を担います。
GROUP BY を使わない集約は、表全体から結果を1行作ります。GROUP BY product_id のようにグループを作る場合は、商品ごとに1行を返します。「必ず1件にする」のではなく、「全体またはグループごとに1件へまとめる」と捉えると正確です。
なぜ集約が必要なのか
生のデータは行数が多すぎて、そのままでは判断に使えません。1年分の注文明細が12万行あっても、知りたいのは「今月の売上はいくらか」「一番売れた商品は何か」といった数個の答えです。集約は、データを意味のある大きさまで縮める工程です。
集約する場所も性能に影響します。12万行をアプリへ取り出してから合計するより、データベース側で SUM を計算し、結果の1行だけを受け取るほうが転送量とメモリ使用量を抑えられます。
SQLでの具体例
商品ごとの注文数、合計金額、平均金額を求めます。
SELECT
product_id,
COUNT(*) AS order_count,
SUM(amount) AS total_amount,
ROUND(AVG(amount)) AS avg_amount
FROM orders
WHERE ordered_at >= '2026-01-01'
GROUP BY product_id
HAVING SUM(amount) >= 10000
ORDER BY total_amount DESC;処理の順番は次のとおりです。
WHERE で集約前の注文明細を絞るGROUP BY で商品ごとのかたまりを作るCOUNT、SUM、AVG で各かたまりを1行へまとめるHAVING で集約後の結果を絞るプログラムでの具体例
同じ商品ごとの合計をPythonで作ると、値を順番に足して商品ごとの1個の結果へまとめる処理になります。
from collections import defaultdict
orders = [
{"product_id": 1, "amount": 3000},
{"product_id": 2, "amount": 8000},
{"product_id": 1, "amount": 5000},
]
totals = defaultdict(int)
for order in orders:
totals[order["product_id"]] += order["amount"]
print(dict(totals)) # {1: 8000, 2: 8000}JavaScriptの reduce() も、配列の要素を1個ずつ累積値へ畳み込む集約です。空配列にも対応できるよう、items.reduce((total, n) => total + n, 0) のように初期値を書くのが安全です。
UML・Javaでいう集約
UMLの集約は、数値を合計する処理ではありません。クラス同士の全体と部分の関係を表す関連の一種で、全体側に白いひし形を書きます。たとえば「チームが選手を持つ」関係では、チームがなくなっても選手は独立して存在できます。
Javaでは集約専用のキーワードはありません。あるオブジェクトが別のオブジェクトへの参照をフィールドに持つことで表します。部分の寿命を全体が強く所有する「コンポジション」は黒いひし形で表し、集約より強い関係です。
つまずきやすいところ
GROUP BY にない列を SELECT に並べる。束ねた行のどの値を出すか決められないため、エラーになりますCOUNT(*) と COUNT(column) を同じだと思う。後者はその列が NULL の行を数えませんWHERE と HAVING を逆にする。集約前の行に対する条件は WHERE、集約後の結果に対する条件は HAVING です似た操作との違い
| 操作 | 入力と出力 | 代表例 |
|---|---|---|
| 集約 | n件から、全体またはグループごとに1件 | SUM、AVG、reduce |
| 変換 | n件からn件 | 税抜価格を税込価格へ変える |
| 絞り込み | n件からn件以下 | 1000円以上だけ残す |
| ソート | n件からn件 | 金額の降順に並べる |
よくある質問
集約と集計は何が違いますか
集計は、合計・平均・件数などを計算する行為を指すことが多い言葉です。集約は「複数をまとめる」というより広い概念で、その手段として集計を行います。データ処理の会話では、ほぼ同じ意味で使われることもあります。
aggregationは日本語で何と訳しますか
一般には「集約」または「集計」と訳します。UMLでは「集約」、SQLや分析では文脈に応じて「集約」「集計」の両方が使われます。
Javaで「集約」と書かれていたら何を指しますか
Stream.reduce() などのデータ処理を指す場合と、クラス同士のhas-a関係を指す場合があります。周囲にコレクションや合計の話があれば前者、クラス図やオブジェクトの寿命の話があれば後者です。
覚え方
データ処理なら「多くの行を、答えとして読める少数の行へまとめる」。UMLなら「全体が部分を持つ」。まず文脈を分けると迷いません。