在SQL的日常使用中,经常需要对表中的数值字段进行总和计算,比如统计某个月的订单总金额、某个品类的商品总库存等,这时候SUM函数就是最得力的工具。下面我们一步步拆解SUM函数的使用方法和相关技巧。

一、SUM函数基础语法
SUM函数属于SQL的聚合函数,作用是计算指定数值列的总和,基础语法如下:
-- 基础语法 SUM([DISTINCT] 数值列名)
其中DISTINCT是可选参数,加上之后会先对列中的值去重,再计算总和,默认是计算所有非NULL值的总和,NULL值会被自动忽略。
二、常见求和场景实现
1. 单表全量求和
如果要计算整张表中某个数值列的总和,直接使用SUM函数即可,比如我们有一张订单表order_info,结构如下:
| 字段名 | 类型 | 说明 |
|---|---|---|
| order_id | int | 订单ID |
| order_amount | decimal | 订单金额 |
| category | varchar | 订单品类 |
计算所有订单的总金额,SQL语句如下:
-- 计算所有订单总金额 SELECT SUM(order_amount) AS total_amount FROM order_info;
2. 分组求和
如果需要按某个维度分组计算总和,比如按品类统计每个品类的订单总金额,需要结合GROUP BY子句使用:
-- 按品类分组统计订单总金额 SELECT category, SUM(order_amount) AS category_total FROM order_info GROUP BY category;
3. 带条件的求和
如果需要在求和时加上筛选条件,有两种常见方式,一种是用WHERE子句筛选整行数据,另一种是用CASE WHEN在SUM函数内部做条件判断。
比如要统计品类为"数码"的订单总金额,用WHERE筛选的方式:
-- 筛选品类为数码的订单求和 SELECT SUM(order_amount) AS digital_total FROM order_info WHERE category = '数码';
如果要同时统计多个品类的金额,还可以在SUM内部加条件,比如同时统计数码和服饰品类的总金额:
-- 一次查询统计多个品类的金额 SELECT SUM(CASE WHEN category = '数码' THEN order_amount ELSE 0 END) AS digital_total, SUM(CASE WHEN category = '服饰' THEN order_amount ELSE 0 END) AS clothing_total FROM order_info;
三、使用SUM函数的注意事项
- SUM函数只会对数值类型的列生效,如果对非数值列使用会直接报错。
- 列中的NULL值不会被计入求和范围,如果需要对NULL值按0处理,可以用
COALESCE函数转换,比如SUM(COALESCE(order_amount, 0))。 - 使用
DISTINCT参数时,要注意去重后的求和是否符合业务需求,避免统计结果偏差。 - 结合
GROUP BY使用时,SELECT后面出现的非聚合列必须全部出现在GROUP BY子句中,否则部分数据库会报错。
提示:如果需要同时计算总和、平均值等多个聚合指标,可以在同一个SELECT语句中同时使用多个聚合函数,比如同时查询总金额和平均金额:SELECT SUM(order_amount) AS total, AVG(order_amount) AS avg FROM order_info;四、SUM函数与其他聚合函数的配合使用
SUM函数经常和COUNT、AVG等聚合函数结合使用,实现更复杂的统计需求。比如统计每个品类的订单总数量、总金额、平均订单金额:
-- 多聚合函数结合使用 SELECT category, COUNT(order_id) AS order_count, SUM(order_amount) AS total_amount, AVG(order_amount) AS avg_amount FROM order_info GROUP BY category;
掌握以上SUM函数的使用方法和技巧,就能应对大部分SQL数值求和的场景,在实际使用中可以根据业务需求灵活组合语法,提升数据处理效率。