【SQL Server】GROUP BYでレコード数をカウントする方法:サンプルコード付き

2024-04-28

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: このステートメントは、EmployeeIDFirstNameLastNameDepartmentID の列を持つ 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


INFORMATION_SCHEMA.COLUMNSを使ってID列を持つテーブルを特定する

SQL Server で、ID 列を持つテーブルをプログラムで特定するには、いくつかの方法があります。ここでは、最も一般的な 2 つの方法について説明します。この方法は、sys. tables と sys. columns システムテーブルを使用して、ID 列を持つテーブルを特定します。...


INFORMATION_SCHEMAを使用してデフォルト制約を見つける方法

データベースには、テーブルの列に設定できる制約がいくつかあります。デフォルト制約は、列に値が挿入されない場合に適用される値を指定します。INFORMATION_SCHEMAは、データベースに関する情報を格納する仮想データベースです。この情報を使用して、デフォルト制約を含む、テーブルに関するさまざまな情報を取得できます。...


C#、SQL Server、DapperでINSERTを実行し、挿入されたIDを取得する方法

SCOPE_IDENTITY()を使用するこの方法は、SCOPE_IDENTITY()関数を使用して、最後に挿入されたIDを取得します。OUTPUT句を使用するこの方法は、OUTPUT句を使用して、INSERTステートメントの一部として挿入されたIDを取得します。...


テーブル作成と既存テーブルへの追加、どっちが最適?SSMS 2012で自動増分主キーを設定する2つの方法

SQL Server Management Studio 2012 (SSMS) を使用して、テーブルに自動増分主キーを設定するには、以下の2つの方法があります。テーブルの作成時にIDENTITYプロパティを使用する既存のテーブルにIDENTITY列を追加する...


パフォーマンスを重視するならテーブル変数?SQL Serverの中間結果処理方法徹底解説

SQL Server でクエリを実行する際、CTE (Common Table Expression)、サブクエリ、一時テーブル、テーブル変数など、さまざまな方法で中間結果を処理できます。それぞれ異なる方法で動作するため、パフォーマンスにも違いが生じます。...


SQL SQL SQL SQL Amazon で見る



COUNTとGROUP BYを同時に使用する方法の他の方法

SQLでCOUNT関数とGROUP BY句を組み合わせることで、特定の列に基づいてデータを集計し、各グループのレコード数をカウントすることができます。例題以下の従業員テーブルがあるとします。各部署の従業員数を取得したい場合このクエリは、以下の結果を返します。