第十一章 SQL聚合函数 SUM
第十一章 SQL聚合函数 SUM
返回指定列值之和的聚合函数。
大纲
SUM([ALL | DISTINCT [BY(col-list)]] expression [%FOREACH(col-list)] [%AFTERHAVING])
参数
-
ALL
- 可选-指定SUM
返回表达式中所有值的和。 如果没有指定关键字,这是默认值。 -
DISTINCT
- 可选-一个DISTINCT
子句,指定SUM
返回表达式中不同(唯一)值的和。DISTINCT
可以指定BY(colo -list)
子句,其中colo -list
可以是单个字段,也可以是用逗号分隔的字段列表。 -
expression
- 任何有效的表达式。 通常是包含要求和的数据值的列的名称。 -
%FOREACH(col-list)
- 可选-列名或以逗号分隔的列名列表。 -
%AFTERHAVING
- 可选-应用在HAVING
子句中的条件。
SUM
返回与
expression
相同的数据类型,但有如下异常:
TINYINT
、
SMALLINT
和
INTEGER
返回的数据类型都是
INTEGER
。
注意:
SUM
可以指定为聚合函数,也可以指定为窗口函数。 本参考页面描述了
SUM
作为聚合函数的使用。
SUM
作为一个窗口函数在窗口函数概述中描述。
描述
SUM
聚合函数返回表达式值的和。 通常,表达式是查询返回的多行中字段的名称(或包含一个或多个字段名称的表达式)。
SUM
可以在引用表或视图的
SELECT
查询或子查询中使用。
SUM
可以在
SELECT
列表或
HAVING
子句中与普通字段值一起出现。
SUM
不能在
WHERE
子句中使用。
SUM
不能在
JOIN
的
ON
子句中使用,除非
SELECT
是子查询。
和所有聚合函数一样,
SUM
可以接受一个可选的
DISTINCT
子句。
SUM(DISTINCT col1)
只汇总那些不同(唯一)的
col1
字段值。
SUM(DISTINCT BY(col2) col1)
只汇总
col2
值不同(唯一)的记录中的
col1
字段值。 但是请注意,不同的
col2
值可能包含一个单独的
NULL
值。
数据值
对于数据类型为
INT
、
SMALLINT
或
TINYINT
的表达式,
SUM
返回的数据类型为
INTEGER
。 对于数据类型为
BIGINT
的表达式,
SUM
返回数据类型
BIGINT
。 对于数据类型为
DOUBLE
的表达式,
SUM
返回数据类型为
DOUBLE
的表达式。 对于所有其他数字数据类型,
SUM
返回数据类型
numeric
。
SUM
返回精度为
18
的值。 返回值的尺度与表达式的尺度相同,但有以下例外。 如果
expression
是一个数据类型为
VARCHAR
或
VARBINARY
的数值,则返回值的尺度为8。
默认情况下,聚合函数使用逻辑(内部)数据值,而不是显示值。
SUM
通常应用于具有数值的字段或表达式。 因为只执行最小的类型检查,所以有可能(尽管很少有意义)对非数字字段调用它。
SUM
计算包括空字符串(
"
)在内的非数值值为
0
(0)。如果
expression
是数据类型
VARCHAR
,则返回到ODBC或JDBC的值是数据类型
DOUBLE
。
在派生
SUM
聚合函数值时,数据字段中的
NULL
值将被忽略。 如果查询没有返回任何行,或者返回的所有行的数据字段值为
NULL
,
SUM
返回
NULL
。
优化
SUM
计算的SQL优化可以使用一个位片索引,如果这个索引是为字段定义的。
当前事务期间所做的更改
与所有聚合函数一样,
SUM
总是返回数据的当前状态,包括未提交的更改,而不考虑当前事务的隔离级别。
示例
在下面的例子中,美元符号()连接到薪金数额。
下面的查询返回示例中所有员工的工资之和。 雇员数据库:
SELECT '$' || SUM(Salary) AS Total_Payroll
FROM Sample.Employee
下面的查询使用
%AFTERHAVING
必须返回所有工资的总和和每个州超过
$80,000
的工资的总和,其中至少有一个人的工资为>
$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
下面的查询返回示例中每个职位工资的总和和平均值。 雇员数据库:
SELECT Title,
'$' || SUM(Salary) AS Total,
'$' || AVG(Salary) AS Average
FROM Sample.Employee
GROUP BY Title
ORDER BY Average
下面的查询显示了与算术表达式一起使用的
SUM
。 对于示例中的每个职位名称。 员工数据库,返回当前工资和工资增加
10%
的工资之和:
SELECT Title,
'$' || SUM(Salary) AS BeforeRaises,
'$' || SUM(Salary * 1.1) AS AfterRaises