COUNT (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric の SQL 分析エンドポイントMicrosoft Fabric のウェアハウス

この関数は、グループ内で見つかった項目数を返します。 COUNTCOUNT_BIG 関数と同じように動作します。 これらの関数の違いは、戻り値のデータ型のみです。 COUNT は常に int データ型の値を返します。 COUNT_BIG は常に bigint データ型の値を返します。

Transact-SQL 構文表記規則

構文

集計関数の構文

COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } )

分析関数の構文

COUNT ( [ ALL ]  { expression | * } ) OVER ( [ <partition_by_clause> ] )

Note

SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

引数

ALL

すべての値にこの集計関数を適用します。 既定として ALL が使用されます。

DISTINCT

COUNT で一意の NULL ではない値の数を返すことを指定します。

式 (expression)

imagentexttext を除く、任意の型のです。 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_WARNINGSON の場合は int NOT NULL ですが、SQL Server は、ISNULL でラップされていない限り、常に COUNT 式をメタデータの int NULL として扱います。

  • ANSI_WARNINGSOFF の場合は 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 である場合、COUNTNULL を返します。 それ以外で、ARITHABORT または ANSI_WARNINGS の "いずれか" が ON の場合、クエリは中止され、算術オーバーフロー エラー Msg 8115, Level 16, State 2; Arithmetic overflow error converting expression to data type int. が発生します。 これらの大きな結果を正しく処理するには、bigint を返す COUNT_BIG を代わりに使用します。

ARITHABORTANSI_WARNINGS の両方が ON 場合は、ISNULL( <count-expr>, 0 )COUNT 呼び出しサイトを安全にラップして、式の型を int NULL ではなく int NOT NULL に強制することができます。 ISNULLCOUNT をラップするということは、オーバーフロー エラーが通知なく抑制されることを意味します。これは、正確性を考慮する必要があります。

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 句を使用する

この例では、MINMAXAVGCOUNT 関数と 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 を使用すると共に

この例では、COUNTHAVING 句を使用して、従業員数が 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 を使用する

この例では、COUNTOVER 句を使用して、指定した各受注に含まれる製品数を返します。

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

関連項目