5. MS SQL 集計関数

 


📊 SQLのデータ分析「集計関数」

皆さん、こんにちは!

これまでは「行」を絞り込んだり、並び替えたりする方法を学びました。しかし、データベースの真の力は「集計(たくさんのデータをまとめて計算すること)」にあります。

今回は、データの塊から「最大値」「平均」「個数」などの単一の結果を導き出す「集計関数(Aggregate Functions)」を紹介します。


📈 第1章:集計関数の基本構造と役割

1-1. 集計関数とは?

集計関数とは、複数の行(値のセット) に対して操作を行い、その結果をたった一つの値(スカラー値) として返す関数です。

役割データの塊 単一の結果
場所主に SELECT句 で使用する
構文SELECT [関数名]([カラム名または *]) FROM [テーブル名]

1-2. 代表的な集計関数(MAX, MIN, AVG, SUM)

関数意味実行例(TotalDue列を使用)
MAX()最大値SELECT MAX(TotalDue) 最も大きな売上総額
MIN()最小値SELECT MIN(TotalDue) 最も小さな売上総額
AVG()平均値 (Average)SELECT AVG(TotalDue) 売上総額の平均
SUM()合計値SELECT SUM(TotalDue) 売上総額の全体合計

【実行例:最大売上総額を見つける】

SELECT MAX(TotalDue)
FROM Sales.SalesOrderHeader;
-- 結果:テーブル内で最大のTotalDue値(例:187487.825)が一つだけ返される。

🔢 第2章:特殊な集計関数 COUNT() の使い方

COUNT()関数は、行の数を数えるために使われますが、少し特殊な挙動をします。

2-1. 行の総数を数える:COUNT(*)

テーブル全体の行数を数えたい場合は、アスタリスク * を使います。これが最も一般的な使い方です。

SELECT COUNT(*)
FROM Sales.SalesOrderHeader;
-- 結果:テーブルに含まれる全行数(例:31465行)

👉 メリット: SELECT * と違い、実際にデータをすべて取り出すわけではないので、非常に高速です。

2-2. NULL値を除外して数える:COUNT(カラム名)

COUNT()の括弧の中にカラム名を入れると、「NULLではない値」が入っている行だけを数えます。

【例】

SELECT COUNT(SalesPersonID) -- SalesPersonIDに値が入っている行だけを数える
FROM Sales.SalesOrderHeader;

-- 結果:SalesPersonIDが NULL ではない行の数(例:209行)が返される。

これは、以下のクエリと同じ結果になります。

SELECT COUNT(*)
FROM Sales.SalesOrderHeader
WHERE SalesPersonID IS NOT NULL;

2-3. 重複を排除して数える:COUNT(DISTINCT カラム名)

ユニーク(重複していない)な値の数だけを数えたい場合に、DISTINCTキーワードを使います。

【例】 Person.PersonテーブルのFirstName(名)列にある、ユニークな名前の種類を数える。

SELECT COUNT(DISTINCT FirstName)
FROM Person.Person;
-- 結果:テーブルに登場する「異なる名前」の総数(例:1018種類)

🎯 第3章:集計関数とWHERE句の組み合わせ

集計関数は、全行に対して計算を行うのが基本ですが、WHERE句を使えば、計算対象の行を絞り込むことができます。

3-1. 評価順序の復習が重要

SQLはWHERE句SELECT句(集計関数がある場所)より先に評価します。

  1. FROM:テーブル全体を選ぶ

  2. WHERE:条件に合わない行を除外する

  3. SELECT:残った行だけで集計関数を実行する

3-2. 【例】2006年の売上総額だけを合計する

SELECT
    SUM(TotalDue) -- 3. 残った行の TotalDue を合計する
FROM
    Sales.SalesOrderHeader
WHERE
    OrderDate BETWEEN '2006-01-01' AND '2006-12-31'; -- 2. 2006年の注文だけを残す

3-3. ⚠️ 数値計算と文字列

SUMAVGのような数値計算の関数を文字列(名前や住所など) の列に使うと、SQLは「文字列を合計できない!」と判断し、エラーになります。関数を使う際は、必ず適切なデータ型の列を選びましょう。