適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Microsoft Fabric の SQL 分析エンドポイント
Microsoft Fabric のウェアハウス
Microsoft Fabric の SQL データベース
この関数は、グループ内で見つかった項目数を返します。
COUNT は COUNT_BIG 関数と同じように動作します。 これらの関数の違いは、戻り値のデータ型のみです。
COUNT は常に int データ型の値を返します。
COUNT_BIG は常に bigint データ型の値を返します。
構文
集計関数の構文
COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } )
分析関数の構文
COUNT ( [ ALL ] { expression | * } ) OVER ( [ <partition_by_clause> ] )
引数
全て
すべての値にこの集計関数を適用します。 既定として ALL が使用されます。
独特
COUNT で一意の NULL ではない値の数を返すことを指定します。
式 (expression)
image、ntext、text を除く、任意の型の式です。
COUNT は、式の集計関数またはサブクエリをサポートしていません。
*
COUNT ですべての行をカウントし、返すテーブルの合計行数を決定することを指定します。
COUNT(*) はパラメーターを取らず、DISTINCT の使用をサポートしていません。
COUNT(*) では、定義上、特定の列についての情報を使用しないため、expression パラメーターは必要ありません。
COUNT(*) は、指定されたテーブル内の行数を返し、重複する行を保持します。 各行は 1 行としてカウントされ、 これには NULL 値を保持している行も含まれます。
オーバー([ partition_by_clause ][ order_by_clause ][ ROW_or_RANGE_clause ])
partition_by_clause は、FROM 句で生成された結果セットをパーティションに分割します。このパーティションに COUNT 関数が適用されます。 指定しない場合、関数ではクエリ結果セットのすべての行を 1 つのグループとして扱います。
order_by_clause は、操作の論理的順序を決定します。 詳細については、OVER 句 (Transact-SQL) に関する記事を参照してください。
戻り値の型
が
ANSI_WARNINGSの場合はONですが、SQL Server は、COUNTでラップされていない限り、常にint NULL式をメタデータのISNULLとして扱います。が
ANSI_WARNINGSの場合はOFF。
解説
-
COUNT(*)を伴わないGROUP BYは、結果セット内のカーディナリティ (行数) が返されます。 これには、すべてNULL値で構成される行や重複する行が含まれます。 -
COUNT(*)を伴うGROUP BYは、各グループの行数を返します。 これにはNULL値と重複が含まれます。 -
COUNT(ALL <expression>)はグループ内の各行に対して expression を評価し、非 NULL 値の数を返します。 -
COUNT(DISTINCT <expression>)はグループ内の各行に対して expression を評価し、非 NULL で一意の値の数を返します。
COUNT は、OVER 句や ORDER BY 句なしで使用される場合は決定的関数です。 OVER および ORDER BY 句と "共に" 使用される場合は、非決定論的関数です。 詳細については、「決定的関数と非決定的関数」を参照してください。
ARITHABORT および ANSI_WARNINGS
COUNT の戻り値が int の最大値 (つまり、231-1 または 2,147,483,647) を超える場合、整数オーバーフローのために COUNT 関数は失敗します。
COUNT でオーバーフローが発生し、 オプションと ARITHABORT オプションの "両方" が ANSI_WARNINGS である場合、OFF は COUNT を返します。NULL それ以外で、 または ARITHABORT の "いずれか" が ANSI_WARNINGS の場合、クエリは中止され、算術オーバーフロー エラー ON が発生します。Msg 8115, Level 16, State 2; Arithmetic overflow error converting expression to data type int. これらの大きな結果を正しく処理するには、COUNT_BIG を返す を代わりに使用します。
ARITHABORT と ANSI_WARNINGS の両方が ON 場合は、COUNT で ISNULL( <count-expr>, 0 ) 呼び出しサイトを安全にラップして、式の型を int NOT NULL ではなく int NULL に強制することができます。
COUNT で ISNULL をラップするということは、オーバーフロー エラーが通知なく抑制されることを意味します。これは、正確性を考慮する必要があります。
例
A。 COUNT と DISTINCT を使用する
この例では、Adventure Works Cycles の従業員が保持できるさまざまな役職の数を返します。
SELECT COUNT(DISTINCT Title)
FROM HumanResources.Employee;
GO
結果セットは次のとおりです。
-----------
67
(1 row(s) affected)
B. COUNT(*) を使用する
この例は、Adventure Works Cycles の従業員の合計数を返します。
SELECT COUNT(*)
FROM HumanResources.Employee;
GO
結果セットは次のとおりです。
-----------
290
(1 row(s) affected)
C: COUNT(*) を他の集計関数と共に使用する
この例は、COUNT(*) が SELECT リスト内の他の集計関数と連携していることを示しています。 この例はAdventureWorks2025データベースを使用しています。
SELECT COUNT(*), AVG(Bonus)
FROM Sales.SalesPerson
WHERE SalesQuota > 25000;
GO
結果セットは次のとおりです。
----------- ---------------------
14 3472.1428
(1 row(s) affected)
D. OVER 句を使用する
この例では、 MIN、 MAX、 AVG 、 COUNT 関数を用いて、 OVER 節を付けて、AdventureWorks2025データベースの HumanResources.Department テーブル内の各部門の集計値を返します。
SELECT DISTINCT Name
, MIN(Rate) OVER (PARTITION BY edh.DepartmentID) AS MinSalary
, MAX(Rate) OVER (PARTITION BY edh.DepartmentID) AS MaxSalary
, AVG(Rate) OVER (PARTITION BY edh.DepartmentID) AS AvgSalary
, COUNT(edh.BusinessEntityID) OVER (PARTITION BY edh.DepartmentID) AS EmployeesPerDept
FROM HumanResources.EmployeePayHistory AS eph
JOIN HumanResources.EmployeeDepartmentHistory AS edh
ON eph.BusinessEntityID = edh.BusinessEntityID
JOIN HumanResources.Department AS d
ON d.DepartmentID = edh.DepartmentID
WHERE edh.EndDate IS NULL
ORDER BY Name;
結果セットは次のとおりです。
Name MinSalary MaxSalary AvgSalary EmployeesPerDept
----------------------------- --------------------- --------------------- --------------------- ----------------
Document Control 10.25 17.7885 14.3884 5
Engineering 32.6923 63.4615 40.1442 6
Executive 39.06 125.50 68.3034 4
Facilities and Maintenance 9.25 24.0385 13.0316 7
Finance 13.4615 43.2692 23.935 10
Human Resources 13.9423 27.1394 18.0248 6
Information Services 27.4038 50.4808 34.1586 10
Marketing 13.4615 37.50 18.4318 11
Production 6.50 84.1346 13.5537 195
Production Control 8.62 24.5192 16.7746 8
Purchasing 9.86 30.00 18.0202 14
Quality Assurance 10.5769 28.8462 15.4647 6
Research and Development 40.8654 50.4808 43.6731 4
Sales 23.0769 72.1154 29.9719 18
Shipping and Receiving 9.00 19.2308 10.8718 6
Tool Design 8.62 29.8462 23.5054 6
(16 row(s) affected)
例: Azure Synapse Analytics、Analytics Platform System (PDW)
E. COUNT と DISTINCT を使用する
この例では、特定の会社の従業員が保持できるさまざまな役職の数を返します。
USE ssawPDW;
SELECT COUNT(DISTINCT Title)
FROM dbo.DimEmployee;
結果セットは次のとおりです。
-----------
67
F. COUNT(*) を使用する
この例は、dbo.DimEmployee テーブルの合計行数を返します。
USE ssawPDW;
SELECT COUNT(*)
FROM dbo.DimEmployee;
結果セットは次のとおりです。
-------------
296
G. COUNT(*) を他の集計関数と共に使用する
この例では、COUNT(*) と、SELECT リスト内の他の集計関数を組み合わせています。 年間販売ノルマが $500,000 より多い販売担当者の数と、販売担当者の平均販売ノルマを返します。
USE ssawPDW;
SELECT COUNT(EmployeeKey) AS TotalCount, AVG(SalesAmountQuota) AS [Average Sales Quota]
FROM dbo.FactSalesQuota
WHERE SalesAmountQuota > 500000 AND CalendarYear = 2001;
結果セットは次のとおりです。
TotalCount Average Sales Quota
---------- -------------------
10 683800.0000
H. HAVING と共に COUNT を使用すると共に
この例では、COUNT と HAVING 句を使用して、従業員数が 15 人を超える会社の部門を返します。
USE ssawPDW;
SELECT DepartmentName,
COUNT(EmployeeKey)AS EmployeesInDept
FROM dbo.DimEmployee
GROUP BY DepartmentName
HAVING COUNT(EmployeeKey) > 15;
結果セットは次のとおりです。
DepartmentName EmployeesInDept
-------------- ---------------
Sales 18
Production 179
一 OVER と共に COUNT を使用する
この例では、COUNT と OVER 句を使用して、指定した各受注に含まれる製品数を返します。
USE ssawPDW;
SELECT DISTINCT COUNT(ProductKey) OVER(PARTITION BY SalesOrderNumber) AS ProductCount
, SalesOrderNumber
FROM dbo.FactInternetSales
WHERE SalesOrderNumber IN (N'SO53115',N'SO55981');
結果セットは次のとおりです。
ProductCount SalesOrderID
------------ -----------------
3 SO53115
1 SO55981