- 类别:
聚合函数 (通用)、 窗口函数的语法和用法 (通用)
SUM¶
返回 expr
的非 NULL 记录总和。可以使用 DISTINCT 关键字来计算唯一非 NULL 值的总和。如果组内的所有记录都是 NULL,则函数返回 NULL。
语法¶
聚合函数
SUM( [ DISTINCT ] <expr1> )
窗口函数
SUM( [ DISTINCT ] <expr1> ) OVER (
[ PARTITION BY <expr2> ]
[ ORDER BY <expr3> [ ASC | DESC ] [ <window_frame> ] ]
)
有关 window_frame
语法的详细信息,请参阅 窗口函数的语法和用法。
实参¶
expr1
这是一个计算结果为数值数据类型(INTEGER、FLOAT、DECIMAL 等)的表达式。
expr2
这是用于划分分区的可选表达式。
expr3
这是每个分区中作为排序规则的可选表达式。(这不会控制整个查询输出的顺序。)
使用说明¶
数值总计为等同的数据类型或较大的数据类型。
传递 VARCHAR 表达式时,此函数会将输入隐式转换为浮点值。如果无法执行转换,则会返回错误。
当此函数作为窗口函数调用,且其中的 OVER 子句包含 ORDER BY 子句时:
需要窗口框架。如果没有明确指定窗口框架,则使用以下默认窗口框架:
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
有关窗口框架的更多信息(包括语法、使用说明和示例),请参阅 窗口函数的语法和用法。
禁止在窗口函数中使用关键字 DISTINCT,否则会导致编译时错误。
示例¶
CREATE OR REPLACE TABLE sum_example(k INT, d DECIMAL(10,5),
s1 VARCHAR(10), s2 VARCHAR(10));
INSERT INTO sum_example VALUES
(1, 1.1, '1.1','one'),
(1, 10, '10','ten'),
(2, 2.2, '2.2','two'),
(2, null, null,'null'),
(3, null, null, 'null'),
(null, 9, '9.9','nine');
SELECT * FROM sum_example;
+------+----------+------+------+
| K | D | S1 | S2 |
|------+----------+------+------|
| 1 | 1.10000 | 1.1 | one |
| 1 | 10.00000 | 10.0 | ten |
| 2 | 2.20000 | 2.2 | two |
| 2 | NULL | NULL | null |
| 3 | NULL | NULL | null |
| NULL | 9.00000 | 9.9 | nine |
+------+----------+------+------+
SELECT SUM(d), SUM(s1) FROM sum_example;
+----------+---------+
| SUM(D) | SUM(S1) |
|----------+---------|
| 22.30000 | 23.2 |
+----------+---------+
SELECT k, SUM(d), SUM(s1) FROM sum_example GROUP BY k;
+------+----------+---------+
| K | SUM(D) | SUM(S1) |
|------+----------+---------|
| 1 | 11.10000 | 11.1 |
| 2 | 2.20000 | 2.2 |
| 3 | NULL | NULL |
| NULL | 9.00000 | 9.9 |
+------+----------+---------+
SELECT SUM(s2) FROM sum_example;
100038 (22018): Numeric value 'one' is not recognized
下面的脚本显示了此函数(以及其他一些汇总窗口函数)的用法:
CREATE OR REPLACE TABLE example_cumulative (p INT, o INT, i INT);
INSERT INTO example_cumulative VALUES
( 0, 1, 10), (0, 2, 20), (0, 3, 30),
(100, 1, 10),(100, 2, 30),(100, 2, 5),(100, 3, 11),(100, 3, 120),
(200, 1, 10000),(200, 1, 200),(200, 1, 808080),(200, 2, 33333),(200, 3, null), (200, 3, 4),
(300, 1, null), (300, 1, null);
SELECT
p, o, i,
COUNT(i) OVER (PARTITION BY p ORDER BY o ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) count_i_Rows_Pre,
SUM(i) OVER (PARTITION BY p ORDER BY o ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) sum_i_Rows_Pre,
AVG(i) OVER (PARTITION BY p ORDER BY o ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) avg_i_Rows_Pre,
MIN(i) OVER (PARTITION BY p ORDER BY o ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) min_i_Rows_Pre,
MAX(i) OVER (PARTITION BY p ORDER BY o ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) max_i_Rows_Pre
FROM example_cumulative
ORDER BY p,o;
+-----+---+--------+------------------+----------------+----------------+----------------+----------------+
| P | O | I | COUNT_I_ROWS_PRE | SUM_I_ROWS_PRE | AVG_I_ROWS_PRE | MIN_I_ROWS_PRE | MAX_I_ROWS_PRE |
|-----+---+--------+------------------+----------------+----------------+----------------+----------------|
| 0 | 1 | 10 | 1 | 10 | 10.000 | 10 | 10 |
| 0 | 2 | 20 | 2 | 30 | 15.000 | 10 | 20 |
| 0 | 3 | 30 | 3 | 60 | 20.000 | 10 | 30 |
| 100 | 1 | 10 | 1 | 10 | 10.000 | 10 | 10 |
| 100 | 2 | 30 | 2 | 40 | 20.000 | 10 | 30 |
| 100 | 2 | 5 | 3 | 45 | 15.000 | 5 | 30 |
| 100 | 3 | 11 | 4 | 56 | 14.000 | 5 | 30 |
| 100 | 3 | 120 | 5 | 176 | 35.200 | 5 | 120 |
| 200 | 1 | 10000 | 1 | 10000 | 10000.000 | 10000 | 10000 |
| 200 | 1 | 200 | 2 | 10200 | 5100.000 | 200 | 10000 |
| 200 | 1 | 808080 | 3 | 818280 | 272760.000 | 200 | 808080 |
| 200 | 2 | 33333 | 4 | 851613 | 212903.250 | 200 | 808080 |
| 200 | 3 | NULL | 4 | 851613 | 212903.250 | 200 | 808080 |
| 200 | 3 | 4 | 5 | 851617 | 170323.400 | 4 | 808080 |
| 300 | 1 | NULL | 0 | NULL | NULL | NULL | NULL |
| 300 | 1 | NULL | 0 | NULL | NULL | NULL | NULL |
+-----+---+--------+------------------+----------------+----------------+----------------+----------------+