相关文章推荐
咆哮的青蛙  ·  qsort函数、sort函数 ...·  1 年前    · 
玩足球的白开水  ·  php ...·  1 年前    · 
善良的烤地瓜  ·  android - Add view to ...·  1 年前    · 
英俊的草稿纸  ·  java.lang.NoSuchFieldE ...·  1 年前    · 

このブラウザーはサポートされなくなりました。

Microsoft Edge にアップグレードすると、最新の機能、セキュリティ更新プログラム、およびテクニカル サポートを利用できます。

Microsoft Edge をダウンロードする Internet Explorer と Microsoft Edge の詳細情報

適用対象: 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 データ型の値を返します。

Transact-SQL 構文表記規則

集計関数の構文

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

分析関数の構文

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

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

すべての値にこの集計関数を適用します。 既定として 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;
    

    結果セットは次のようになります。

    -----------
    (1 row(s) affected)
    

    B. COUNT(*) を使用する

    この例は、Adventure Works Cycles の従業員の合計数を返します。

    SELECT COUNT(*)
    FROM HumanResources.Employee;
    

    結果セットは次のようになります。

    -----------
    (1 row(s) affected)
    

    C. COUNT(*) を他の集計関数と共に使用する

    この例は、COUNT(*)SELECT リスト内の他の集計関数と連携していることを示しています。 この例では、AdventureWorks2022 データベースを使います。

    SELECT COUNT(*), AVG(Bonus)
    FROM Sales.SalesPerson
    WHERE SalesQuota > 25000;
    

    結果セットは次のようになります。

    ----------- ---------------------
    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;
    

    結果セットは次のようになります。

    -----------
    

    F. COUNT(*) を使用する

    この例は、dbo.DimEmployee テーブルの合計行数を返します。

    USE ssawPDW;
    SELECT COUNT(*)
    FROM dbo.DimEmployee;
    

    結果セットは次のようになります。

    -------------
    

    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
    
  • 集計関数 (Transact-SQL)
  • COUNT_BIG (Transact-SQL)
  • OVER 句 (Transact-SQL)
  •