SUM 函数
sum(expr) OVER ([partition_clause] [orderby_clause] [frame_clause])
功能描述
SUM 函数用于计算窗口内指定表达式(expr)的数值和。该函数可以对数据进行分组求和,或者按照指定的排序规则计算累积和。
参数说明
- expr : 需要求和的数值表达式,可以是 tinyint、smallint、int、bigint、float、double 或 decimal 类型。
返回类型
- 当 expr 为 decimal 类型时,返回 decimal 类型,precision 可能会相应增加。
- 当 expr 为整数类型时,返回 bigint 类型。
- 其他情况下,返回 double 类型。
注意事项
使用示例
例子 1:按部门分组求和
SELECT dep_no, salary, sum(salary) OVER (PARTITION BY dep_no) AS total_salary
FROM VALUES
('Eric', 1, 28000),
('Alex', 1, 32000),
('Felix', 2, 21000),
('Frank', 1, 30000),
('Tom', 2, 23000),
('Jane', 3, 29000),
('Jeff', 3, 35000),
('Paul', 2, 29000),
('Charles', 2, 23000),
('Charles F', 2, 23000),
('null',4,null),
('NotNull',4,23000)
AS tab(name, dep_no, salary);
+--------+--------+--------------+
| dep_no | salary | total_salary |
+--------+--------+--------------+
| 3 | 29000 | 64000 |
| 3 | 35000 | 64000 |
| 1 | 28000 | 90000 |
| 1 | 32000 | 90000 |
| 1 | 30000 | 90000 |
| 2 | 21000 | 119000 |
| 2 | 23000 | 119000 |
| 2 | 29000 | 119000 |
| 2 | 23000 | 119000 |
| 2 | 23000 | 119000 |
| 4 | null | 23000 |
| 4 | 23000 | 23000 |
+--------+--------+--------------+
上述 SQL 查询将返回每个部门的员工工资总和。
例子 2:结合排序和分组求和
SELECT dep_no, salary, sum(salary) OVER (PARTITION BY dep_no ORDER BY salary DESC) AS rank_by_salary
FROM VALUES
('Eric', 1, 28000),
('Alex', 1, 32000),
('Felix', 2, 21000),
('Frank', 1, 30000),
('Tom', 2, 23000),
('Jane', 3, 29000),
('Jeff', 3, 35000),
('Paul', 2, 29000),
('Charles', 2, 23000),
('Charles F', 2, 23000),
('null',4,null),
('NotNull',4,23000)
AS tab(name, dep_no, salary);
+--------+--------+----------------+
| dep_no | salary | rank_by_salary |
+--------+--------+----------------+
| 3 | 35000 | 35000 |
| 3 | 29000 | 64000 |
| 1 | 32000 | 32000 |
| 1 | 30000 | 62000 |
| 1 | 28000 | 90000 |
| 2 | 29000 | 29000 |
| 2 | 23000 | 98000 |
| 2 | 23000 | 98000 |
| 2 | 23000 | 98000 |
| 2 | 21000 | 119000 |
| 4 | 23000 | 23000 |
| 4 | null | 23000 |
+--------+--------+----------------+
这个查询将根据每个部门的员工工资降序排列,并计算每个员工在其所在部门的工资排名累积和。
总结
SUM 函数是 SQL 中非常实用的聚合函数,可以灵活地应用于各种数据分析场景,如计算分组总和、累积和等。通过结合窗口函数的特性,可以进一步扩展其应用范围,为数据分析师和数据库开发者提供强大的数据计算能力。