SUM (Transact-SQL)SUM (Transact-SQL)

適用対象:Applies to: はいSQL ServerSQL Server (サポートされているすべてのバージョン) yesSQL ServerSQL Server (all supported versions) はいAzure SQL データベースAzure SQL DatabaseYesAzure SQL データベースAzure SQL Database はいAzure SQL Managed InstanceAzure SQL Managed InstanceYesAzure SQL Managed InstanceAzure SQL Managed Instance はいAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics はいParallel Data WarehouseParallel Data WarehouseyesParallel Data WarehouseParallel Data Warehouse適用対象:Applies to: はいSQL ServerSQL Server (サポートされているすべてのバージョン) yesSQL ServerSQL Server (all supported versions) はいAzure SQL データベースAzure SQL DatabaseYesAzure SQL データベースAzure SQL Database はいAzure SQL Managed InstanceAzure SQL Managed InstanceYesAzure SQL Managed InstanceAzure SQL Managed Instance はいAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics はいParallel Data WarehouseParallel Data WarehouseyesParallel Data WarehouseParallel Data Warehouse

式の、すべての値または DISTINCT 値のみの合計を返します。Returns the sum of all the values, or only the DISTINCT values, in the expression. SUM は、数値型列に対して使用できます。SUM can be used with numeric columns only. NULL 値は無視されます。Null values are ignored.

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions

構文Syntax

-- Aggregate Function Syntax    
SUM ( [ ALL | DISTINCT ] expression )  

-- Analytic Function Syntax   
SUM ([ ALL ] expression) OVER ( [ partition_by_clause ] order_by_clause)  

注意

SQL Server 2014 以前の Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.

引数Arguments

ALLALL
すべての値にこの集計関数を適用します。Applies the aggregate function to all values. ALL が既定値です。ALL is the default.

DISTINCTDISTINCT
SUM で一意な値の合計を返すことを指定します。Specifies that SUM returns the sum of unique values.

式 (expression)expression
定数、列、関数、および算術演算子、ビット演算子、文字列演算子の組み合わせを指定します。Is a constant, column, or function, and any combination of arithmetic, bitwise, and string operators. expression は、bit データ型を除く、真数データ型または概数データ型の式です。expression is an expression of the exact numeric or approximate numeric data type category, except for the bit data type. 集計関数とサブクエリは使用できません。Aggregate functions and subqueries are not permitted. 詳細については、「式 (Transact-SQL)」を参照してください。For more information, see Expressions (Transact-SQL).

OVER ( [ partition_by_clause ] order_by_clause )OVER ( [ partition_by_clause ] order_by_clause)
partition_by_clause は、FROM 句で生成された結果セットをパーティションに分割します。このパーティションに関数が適用されます。partition_by_clause divides the result set produced by the FROM clause into partitions to which the function is applied. 指定しない場合、関数ではクエリ結果セットのすべての行を 1 つのグループとして扱います。If not specified, the function treats all rows of the query result set as a single group. order_by_clause は、操作が実行される論理的順序を決定します。order_by_clause determines the logical order in which the operation is performed. order_by_clause は必須です。order_by_clause is required. 詳細については、を参照してください。 OVER 句 (Transact-SQL).For more information, see OVER Clause (Transact-SQL).

戻り値の型Return Types

最も有効桁数の大きい expression のデータ型で、すべての expression 値の合計を返します。Returns the summation of all expression values in the most precise expression data type.

式の結果Expression result の戻り値の型 :Return type
tinyinttinyint intint
smallintsmallint intint
intint intint
bigintbigint bigintbigint
decimal カテゴリ (p, s)decimal category (p, s) decimal(38, s)decimal(38, s)
money および smallmoney カテゴリmoney and smallmoney category moneymoney
float および real カテゴリfloat and real category floatfloat

注釈Remarks

SUM は、OVER 句や ORDER BY 句なしで使用される場合は決定的関数です。SUM is a deterministic function when used without the OVER and ORDER BY clauses. OVER 句や ORDER BY 句と共に使用される場合は、非決定的関数です。It is nondeterministic when specified with the OVER and ORDER BY clauses. 詳細については、「 決定的関数と非決定的関数」を参照してください。For more information, see Deterministic and Nondeterministic Functions.

Examples

A.A. SUM を使用して集計データを返すUsing SUM to return summary data

次の例では、SUM 関数を使用して AdventureWorks2012AdventureWorks2012 データベースの集計データを返す方法を示します。The following examples show using the SUM function to return summary data in the AdventureWorks2012AdventureWorks2012 database.

SELECT Color, SUM(ListPrice), SUM(StandardCost)  
FROM Production.Product  
WHERE Color IS NOT NULL   
    AND ListPrice != 0.00   
    AND Name LIKE 'Mountain%'  
GROUP BY Color  
ORDER BY Color;  
GO  

結果セットは次のようになります。Here is the result set.

Color
--------------- --------------------- ---------------------
Black           27404.84              5214.9616
Silver          26462.84              14665.6792
White           19.00                 6.7926

(3 row(s) affected)

B.B. OVER 句を使用するUsing the OVER clause

次の例では、OVER 句を指定した SUM 関数を使用して、AdventureWorks2012AdventureWorks2012 データベースの Sales.SalesPerson テーブルに各区域の年間売り上げの累積合計を入力します。The following example uses the SUM function with the OVER clause to provide a cumulative total of yearly sales for each territory in the Sales.SalesPerson table in the AdventureWorks2012AdventureWorks2012 database. データは TerritoryID によってパーティションに分割され、SalesYTD によって論理的に順序付けされます。The data is partitioned by TerritoryID and logically ordered by SalesYTD. つまり、SUM 関数は年を基にして区域ごとに計算されます。This means that the SUM function is computed for each territory based on the sales year. TerritoryID 1 の 2005 年については、その年の 2 人の営業担当者を表す 2 行があります。Notice that for TerritoryID 1, there are two rows for sales year 2005 representing the two sales people with sales that year. これら 2 行の合計売上が計算された後、2006 年の売上を表す 3 番目の行が計算に組み込まれます。The cumulative sales total for these two rows is computed and then the third row representing sales for the year 2006 is included in the computation.

SELECT BusinessEntityID, TerritoryID   
   ,DATEPART(yy,ModifiedDate) AS SalesYear  
   ,CONVERT(VARCHAR(20),SalesYTD,1) AS  SalesYTD  
   ,CONVERT(VARCHAR(20),AVG(SalesYTD) OVER (PARTITION BY TerritoryID   
                                            ORDER BY DATEPART(yy,ModifiedDate)   
                                           ),1) AS MovingAvg  
   ,CONVERT(VARCHAR(20),SUM(SalesYTD) OVER (PARTITION BY TerritoryID   
                                            ORDER BY DATEPART(yy,ModifiedDate)   
                                            ),1) AS CumulativeTotal  
FROM Sales.SalesPerson  
WHERE TerritoryID IS NULL OR TerritoryID < 5  
ORDER BY TerritoryID,SalesYear;  

結果セットは次のようになります。Here is the result set.

  
BusinessEntityID TerritoryID SalesYear   SalesYTD             MovingAvg            CumulativeTotal  
---------------- ----------- ----------- -------------------- -------------------- --------------------  
274              NULL        2005        559,697.56           559,697.56           559,697.56  
287              NULL        2006        519,905.93           539,801.75           1,079,603.50  
285              NULL        2007        172,524.45           417,375.98           1,252,127.95  
283              1           2005        1,573,012.94         1,462,795.04         2,925,590.07  
280              1           2005        1,352,577.13         1,462,795.04         2,925,590.07  
284              1           2006        1,576,562.20         1,500,717.42         4,502,152.27  
275              2           2005        3,763,178.18         3,763,178.18         3,763,178.18  
277              3           2005        3,189,418.37         3,189,418.37         3,189,418.37  
276              4           2005        4,251,368.55         3,354,952.08         6,709,904.17  
281              4           2005        2,458,535.62         3,354,952.08         6,709,904.17  
  
(10 row(s) affected)  
  

この例では、OVER 句に PARTITION BY が含まれません。In this example, the OVER clause does not include PARTITION BY. これは、関数がクエリによって返されるすべての行に適用されることを意味します。This means that the function will be applied to all rows returned by the query. OVER 句で指定されている ORDER BY 句によって、SUM 関数が適用される論理的な順序が決まります。The ORDER BY clause specified in the OVER clause determines the logical order to which the SUM function is applied. このクエリは、WHERE 句で指定されているすべての営業区域について、年ごとの売上の累積合計を返します。The query returns a cumulative total of sales by year for all sales territories specified in the WHERE clause. SELECT ステートメントで指定されている ORDER BY 句により、クエリの行が表示される順序が決まります。The ORDER BY clause specified in the SELECT statement determines the order in which the rows of the query are displayed.

SELECT BusinessEntityID, TerritoryID   
   ,DATEPART(yy,ModifiedDate) AS SalesYear  
   ,CONVERT(VARCHAR(20),SalesYTD,1) AS  SalesYTD  
   ,CONVERT(VARCHAR(20),AVG(SalesYTD) OVER (ORDER BY DATEPART(yy,ModifiedDate)   
                                            ),1) AS MovingAvg  
   ,CONVERT(VARCHAR(20),SUM(SalesYTD) OVER (ORDER BY DATEPART(yy,ModifiedDate)   
                                            ),1) AS CumulativeTotal  
FROM Sales.SalesPerson  
WHERE TerritoryID IS NULL OR TerritoryID < 5  
ORDER BY SalesYear;  

結果セットは次のようになります。Here is the result set.

BusinessEntityID TerritoryID SalesYear   SalesYTD             MovingAvg            CumulativeTotal  
---------------- ----------- ----------- -------------------- -------------------- --------------------  
274              NULL        2005        559,697.56           2,449,684.05         17,147,788.35  
275              2           2005        3,763,178.18         2,449,684.05         17,147,788.35  
276              4           2005        4,251,368.55         2,449,684.05         17,147,788.35  
277              3           2005        3,189,418.37         2,449,684.05         17,147,788.35  
280              1           2005        1,352,577.13         2,449,684.05         17,147,788.35  
281              4           2005        2,458,535.62         2,449,684.05         17,147,788.35  
283              1           2005        1,573,012.94         2,449,684.05         17,147,788.35  
284              1           2006        1,576,562.20         2,138,250.72         19,244,256.47  
287              NULL        2006        519,905.93           2,138,250.72         19,244,256.47  
285              NULL        2007        172,524.45           1,941,678.09         19,416,780.93  
(10 row(s) affected)  

例: Azure Synapse AnalyticsAzure Synapse AnalyticsParallel Data WarehouseParallel Data WarehouseExamples: Azure Synapse AnalyticsAzure Synapse Analytics and Parallel Data WarehouseParallel Data Warehouse

C.C. 単純な SUM の例A simple SUM example

次の例は、2003 年に販売された各製品の合計数を返します。The following example returns the total number of each product sold in the year 2003.

-- Uses AdventureWorks  
  
SELECT ProductKey, SUM(SalesAmount) AS TotalPerProduct  
FROM dbo.FactInternetSales  
WHERE OrderDateKey >= '20030101'   
      AND OrderDateKey < '20040101'  
GROUP BY ProductKey  
ORDER BY ProductKey;  
  

次に結果セットの一部を示します。Here is a partial result set.

ProductKey  TotalPerProduct
----------  ---------------
214         31421.0200
217         31176.0900
222         29986.4300
225          7956.1500

D.D. 複数の列でグループ合計を計算するCalculating group totals with more than one column

次の例では、ListPrice テーブルに一覧された色ごとに StandardCostProduct の合計を計算します。The following example calculates the sum of the ListPrice and StandardCost for each color listed in the Product table.

-- Uses AdventureWorks  
  
SELECT Color, SUM(ListPrice)AS TotalList,   
       SUM(StandardCost) AS TotalCost  
FROM dbo.DimProduct  
GROUP BY Color  
ORDER BY Color;  

結果セットの最初の部分を次に示します。The first part of the result set is shown below:

Color       TotalList      TotalCost
----------  -------------  --------------
Black       101295.7191    57490.5378
Blue         24082.9484    14772.0524
Grey           125.0000       51.5625
Multi          880.7468      526.4095
NA            3162.3564     1360.6185

参照See Also

集計関数 (Transact-SQL) Aggregate Functions (Transact-SQL)
OVER 句 (Transact-SQL)OVER Clause (Transact-SQL)