COUNT (Transact-SQL)
Applies to: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric の SQL 分析エンドポイント Microsoft Fabric のウェアハウス
この関数は、グループ内で見つかった項目数を返します。 COUNT
は COUNT_BIG 関数と同じように動作します。 これらの関数の違いは、戻り値のデータ型のみです。 COUNT
は常に int データ型の値を返します。 COUNT_BIG
は常に bigint データ型の値を返します。
構文
集計関数の構文
COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } )
分析関数の構文
COUNT ( [ ALL ] { expression | * } ) OVER ( [ <partition_by_clause> ] )
引数
ALL
すべての値にこの集計関数を適用します。 既定として ALL が使用されます。
DISTINCT
COUNT
で一意の NULL ではない値の数を返すことを指定します。
式 (expression)
image、ntext、text を除く、任意の型の式です。 COUNT
は、式の集計関数またはサブクエリをサポートしていません。
*
COUNT
ですべての行をカウントし、返すテーブルの合計行数を決定することを指定します。 COUNT(*)
はパラメーターを取らず、DISTINCT の使用をサポートしていません。 COUNT(*)
では、定義上、特定の列についての情報を使用しないため、expression パラメーターは必要ありません。 COUNT(*)
は、指定されたテーブル内の行数を返し、重複する行を保持します。 各行は 1 行としてカウントされ、 これには NULL 値を保持している行も含まれます。
OVER ( [ 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
の場合は int NOT NULL ですが、SQL Server は、ISNULL
でラップされていない限り、常にCOUNT
式をメタデータのint NULL
として扱います。ANSI_WARNINGS
がOFF
の場合は int NULL。
解説
GROUP BY
を伴わないCOUNT(*)
は、結果セット内のカーディナリティ (行数) が返されます。 これには、すべてNULL
値で構成される行や重複する行が含まれます。GROUP BY
を伴うCOUNT(*)
は、各グループの行数を返します。 これには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.
が発生します。 これらの大きな結果を正しく処理するには、bigint を返す COUNT_BIG
を代わりに使用します。
ARITHABORT
と ANSI_WARNINGS
の両方が ON
場合は、ISNULL( <count-expr>, 0 )
で COUNT
呼び出しサイトを安全にラップして、式の型を int NULL
ではなく int NOT NULL
に強制することができます。 ISNULL
で COUNT
をラップするということは、オーバーフロー エラーが通知なく抑制されることを意味します。これは、正確性を考慮する必要があります。
例
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
リスト内の他の集計関数と連携していることを示しています。 この例では、AdventureWorks2022 データベースを使います。
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
句を使って、AdventureWorks2022 データベースの 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
I. 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