第十一章 SQL聚合函数 SUM

第十一章 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