【SQL Server】GROUP BYでレコード数をカウントする方法:サンプルコード付き
SQL Server で GROUP BY を使ったレコード数のカウント
SQL Server で T-SQL を使用する場合、GROUP BY 句と COUNT 集計関数を使用して、結果セットをグループ化し、各グループ内のレコード数をカウントすることはよくあるタスクです。このチュートリアルでは、この操作をわかりやすく説明します。
例
次の従業員テーブルがあると仮定します。
CREATE TABLE Employees (
EmployeeID INT IDENTITY PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50),
DepartmentID INT
);
INSERT INTO Employees (FirstName, LastName, DepartmentID)
VALUES
('John', 'Doe', 1),
('Jane', 'Smith', 2),
('Peter', 'Jones', 1),
('Mary', 'Evans', 2),
('Linda', 'Taylor', 1),
('Mark', 'Williams', 2);
このテーブルを使用して、各部門の従業員数をカウントするには、次のクエリを実行します。
SELECT DepartmentID, COUNT(*) AS EmployeeCount
FROM Employees
GROUP BY DepartmentID;
このクエリは次の結果を返します。
DepartmentID | EmployeeCount
-------------+--------------
1 | 3
2 | 3
解説
SELECT DepartmentID, COUNT(*) AS EmployeeCount
: この句は、選択する列を指定します。この場合、DepartmentID
列とCOUNT(*)
関数を指定します。COUNT(*)
は、選択されたすべてのレコードをカウントし、EmployeeCount
というエイリアスで結果を返します。FROM Employees
: この句は、クエリで使用されるテーブルを指定します。この例では、Employees
テーブルを使用します。GROUP BY DepartmentID
: この句は、結果セットをDepartmentID
列でグループ化することを指示します。これにより、各部門の従業員数をカウントできます。
補足
COUNT(*)
以外にも、COUNT
関数を使用して特定の列の値をカウントできます。たとえば、各部門のマネージャーの数をカウントするには、次のようにクエリを変更できます。
SELECT DepartmentID, COUNT(ManagerID) AS ManagerCount
FROM Employees
WHERE ManagerID IS NOT NULL
GROUP BY DepartmentID;
HAVING
句を使用して、集計結果に対して条件を指定することもできます。たとえば、従業員数が 5 人以上の部門のみを表示するには、次のようにクエリを変更できます。
SELECT DepartmentID, COUNT(*) AS EmployeeCount
FROM Employees
GROUP BY DepartmentID
HAVING COUNT(*) >= 5;
以下のサンプルコードは、Employee
テーブルを使用して、各部署の従業員数をカウントする方法を示しています。
CREATE TABLE Employees (
EmployeeID INT IDENTITY PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50),
DepartmentID INT
);
INSERT INTO Employees (FirstName, LastName, DepartmentID)
VALUES
('John', 'Doe', 1),
('Jane', 'Smith', 2),
('Peter', 'Jones', 1),
('Mary', 'Evans', 2),
('Linda', 'Taylor', 1),
('Mark', 'Williams', 2);
SELECT DepartmentID, COUNT(*) AS EmployeeCount
FROM Employees
GROUP BY DepartmentID;
DepartmentID | EmployeeCount
-------------+--------------
1 | 3
2 | 3
説明
CREATE TABLE Employees
: このステートメントは、EmployeeID
、FirstName
、LastName
、DepartmentID
の列を持つEmployees
という名前のテーブルを作成します。INSERT INTO Employees
: このステートメントは、Employees
テーブルに 6 行のデータを追加します。
このサンプルコードは、GROUP BY を使用してレコード数をカウントする方法を理解するのに役立ちます。
このサンプルコードは、基本的な例です。実際の状況では、より複雑なクエリが必要になる場合があります。たとえば、部門名と従業員数を一緒に表示したり、特定の条件に基づいて結果をフィルタリングしたりする必要がある場合があります。
SQL Server で GROUP BY を使用せずにレコード数をカウントする方法
従来の GROUP BY
句を使用せずに、SQL Server でレコード数をカウントする方法をいくつか紹介します。これらの方法は、より高速で効率的な場合がありますが、状況によっては使用できない場合があります。
サブクエリを使用して、COUNT(*)
関数を直接呼び出すことができます。次のような例です。
SELECT (
SELECT COUNT(*)
FROM Employees
) AS EmployeeCount;
このクエリは、Employees
テーブル内のすべてのレコード数をカウントします。
ウィンドウ関数
SQL Server 2008 以降では、ウィンドウ関数を使用してレコードをカウントできます。次のような例です。
SELECT COUNT(*) OVER() AS EmployeeCount
FROM Employees;
COMMON TABLE EXPRESSION (CTE)
CTE を使用して、クエリ内で一時的な結果セットを作成し、その結果セットに対して COUNT(*)
関数を呼び出すことができます。次のような例です:
WITH EmployeeCount AS (
SELECT COUNT(*)
FROM Employees
)
SELECT *
FROM EmployeeCount;
最適な方法を選択する
使用する方法は、データの量、クエリの複雑さ、必要な結果セットの精度など、さまざまな要因によって異なります。一般的に、小規模なテーブルの場合はサブクエリが高速で効率的ですが、大規模なテーブルの場合は GROUP BY
句を使用する方が効率的です。ウィンドウ関数は、より複雑なクエリで使用する場合に役立ちます。CTE は、クエリをよりモジュール化および再利用可能にするために使用できます。
その他の考慮事項
- サブクエリと CTE は、パフォーマンスに影響を与える可能性があるため、複雑なクエリで使用するときは注意が必要です。
- ウィンドウ関数は、新しい機能であるため、すべての SQL Server バージョンでサポートされているわけではありません。
COUNT(*)
関数は、NULL 値もカウントします。カウントから NULL 値を除外する必要がある場合は、COUNT(DISTINCT column_name)
関数を使用する必要があります。
GROUP BY
句は、SQL Server でレコード数をカウントするための標準的な方法ですが、状況によっては他の方法がより適切な場合があります。最適な方法は、特定のニーズに応じて選択する必要があります。
sql-server t-sql count