SUM (SQL)
構文
SUM([ ALL | DISTINCT [BY(col-list)] ]
expression
[ %FOREACH(col-list) ] [ %AFTERHAVING ])
概要
SUM 集約関数は、expression の値の合計を返します。一般的に expression は、クエリで返される複数行の中のフィールドの名前 (または、フィールド名を 1 つ以上含む式) です。
SUM は、テーブルまたはビューを参照する SELECT クエリやサブクエリで使用できます。SUM は、一般のフィールド値と共に SELECT リストや HAVING 節で使用できます。
SUM は、WHERE 節では使用できません。SELECT がサブクエリの場合を除いて、JOIN の ON 節では、SUM を使用できません。
SUM は、すべての集約関数と同様に、オプションの DISTINCT 節を取ることができます。SUM(DISTINCT col1) は、これらの個別 (一意) の col1 フィールド値のみの合計値を計算します。SUM(DISTINCT BY(col2) col1) は、col2 値が個別 (一意) であるレコードのこれらの col1 フィールド値のみの合計値を計算します。ただし、個別の col2 値には、個別値として NULL が 1 つ含まれる場合があります。
データ値
SUM は、データ型が INT、SMALLINT、または TINYINT の expression に対して、データ型 INTEGER を返します。SUM は、データ型が BIGINT の expression に対して、データ型 BIGINT を返します。SUM は、データ型が DOUBLE の expression に対して、データ型 DOUBLE を返します。他のすべての数値データ型に対して、SUM はデータ型 NUMERIC を返します。
SUM は、有効桁数が 18 の値を返します。返り値の小数桁数は expression の小数桁数と同じですが、以下の例外があります。expression が数値で、そのデータ型が VARCHAR または VARBINARY の場合、返り値の小数桁数は 8 になります。
既定では、集約関数は Display 値ではなく、Logical (内部) データ値を使用します。
通常、SUM は数値を含むフィールドまたは式に適用されます。タイプ・チェックはごくわずかしか実行されないため、(ほとんど意味はありませんが) 非数値フィールドに対して実行できます。SUM では、空文字列 (") のように数値でない値はゼロ (0) として扱われます。expression のデータ型が VARCHAR の場合、ODBC または JDBC への返り値は DOUBLE データ型になります。
データ・フィールドの NULL 値は、SUM 集約関数値を得る場合は無視されます。クエリから行が返されない場合や、すべての行のデータ・フィールド値が NULL の場合、SUM は NULL を返します。
最適化
SUM 計算の SQL 最適化では、ビットスライス・インデックスがフィールドに定義されている場合、それを使用することができます。
引数
ALL
SUM で、expression にある値すべての値の合計を返すことを指定する引数 (オプション)。キーワードが指定されていない場合は、これが既定になります。
DISTINCT
SUM が expression の個別 (一意) の値の合計を返すように指定する DISTINCT 節 (オプション)。DISTINCT で BY(col-list) 従属節を指定できます。col-list には 1 つのフィールド、またはコンマ区切りのフィールドのリストを指定できます。
expression
任意の有効な式。普通は、合計値算出の対象となるデータ値を含む列の名前を指定します。
%FOREACH(col-list)
1 つの列名、またはコンマで区切った複数の列名のリストです (オプション)。%FOREACH の詳細は、"SELECT" を参照してください。
%AFTERHAVING
HAVING 節にある条件を適用する引数 (オプション)。
SUM は expression と同じデータ型を返します。ただし、TINYINT、SMALLINT、および INTEGER は例外で、これらはすべて INTEGER データ型として返されます。
SUM は、集約関数またはウィンドウ関数として指定できます。このリファレンス・ページでは、集約関数としての SUM の使用法について説明します。ウィンドウ関数としての SUM については、"ウィンドウ関数の概要" で説明しています。
現在のトランザクションで発生する変更
すべての集約関数と同様に、SUM も必ず、現在のトランザクションの分離レベルに関係なく、コミットされていない変更も含めてデータの現在の状態を返します。詳細は、"SET TRANSACTION" および "START TRANSACTION" を参照してください。
例
以下の例では、Salary 金額にドル記号 ($) を連結します。
以下のクエリは、Sample.Employee データベースに記録されている全従業員の給与の合計を返します。
SELECT '$' || SUM(Salary) AS Total_Payroll
FROM Sample.Employee
以下のクエリは、%AFTERHAVING を使用して、給与額が $80,000 より多い人が 1 人以上いる各州について、すべての給与額の合計と $80,000 を超える給与額の合計を返します。
SELECT Home_State,
'$' || SUM(Salary) AS Total_Payroll,
'$' || SUM(Salary %AFTERHAVING) AS Exec_Payroll
FROM Sample.Employee
GROUP BY Home_State
HAVING Salary > 80000
ORDER BY Home_State
以下のクエリは、Sample.Employee データベースに記録されている役職ごとの給与の合計と平均値を返します。
SELECT Title,
'$' || SUM(Salary) AS Total,
'$' || AVG(Salary) AS Average
FROM Sample.Employee
GROUP BY Title
ORDER BY Average
以下のクエリは、算術式と共に使用される SUM を示しています。Sample.Employee データベースに記録されている各役職に対して、現在の給与の合計と支払いに 10% 増加した給与の合計を返します。
SELECT Title,
'$' || SUM(Salary) AS BeforeRaises,
'$' || SUM(Salary * 1.1) AS AfterRaises
FROM Sample.Employee
GROUP BY Title
ORDER BY Title
以下のクエリは、CASE 文を使用して論理式と共に使用される SUM を示しています。すべての定額給従業員をカウントし、SUM を使用して $90,000 以上の所得があるすべての定額給従業員をカウントします。
SELECT COUNT(Salary) As AllPaid,
SUM(CASE WHEN (Salary >= 90000)
THEN 1 ELSE 0 END) As TopPaid
FROM Sample.Employee