在 MySQL 中,SUM() 函数用于对指定列的数值进行求和。当我们需要忽略列中的重复数值,只把出现过的不重复值相加时,可以在 SUM() 内部使用 DISTINCT 关键字。这种写法能有效避免重复数据对统计结果的干扰。

基本语法
计算列中不同值总和的语法如下:
SELECT SUM(DISTINCT column_name) FROM table_name WHERE condition;
其中 DISTINCT 会先对 column_name 去重,再由 SUM 对去重后的值求和。如果不写 DISTINCT,SUM 默认计算所有行的值。
示例数据
假设有一张订单表 orders,结构如下:
| id | user_id | amount |
|---|---|---|
| 1 | 101 | 50 |
| 2 | 102 | 50 |
| 3 | 103 | 80 |
| 4 | 104 | 50 |
普通 SUM 查询
下面语句会把所有 amount 相加,结果为 230:
SELECT SUM(amount) AS total FROM orders;
使用 DISTINCT 的 SUM 查询
只计算不同金额的总和,50 和 80 各算一次,结果为 130:
SELECT SUM(DISTINCT amount) AS distinct_total FROM orders;
注意事项
- DISTINCT 作用于 SUM 括号内的列,不能跨多列去重。
- 对于 NULL 值,SUM(DISTINCT col) 会忽略 NULL,不参与计算。
- 在文本或日期列上使用 DISTINCT 求和没有意义,SUM 仅支持数值类型。
结合条件过滤
可以在 WHERE 中先筛选,再对结果去重求和:
SELECT SUM(DISTINCT amount) AS distinct_total FROM orders WHERE user_id > 101;
以上查询先过滤出 user_id 大于 101 的行,再对 amount 去重求和,结果为 130(包含 50 和 80)。
合理使用 SUM(DISTINCT) 能在报表统计中准确反映不重复业务的数值合计,是数据清洗后聚合的常用手段。