在编写SQL查询时,我们经常需要对某一列做求和,但业务里往往要同时看多个指标的合计,例如订单表中的商品金额、运费、优惠金额分别汇总,或者把这几列加在一起算总支出。SQL的聚合函数SUM本身只针对单列,不过我们可以灵活组合来完成多列总和的计算。

一、对多列分别求和
最简单的方式是在SELECT子句里写多个SUM,每个对应一列。这样查询会返回每一列的合计值。
SELECT SUM(price) AS total_price, SUM(freight) AS total_freight, SUM(discount) AS total_discount FROM orders WHERE create_time >= '2023-01-01';
上面的语句会算出价格、运费、折扣三列各自的总和,互不干扰。
二、计算多列相加后的总和
如果想得到每行先加总、再整体求和的结果,可以先把列用加号连起来,再包一层SUM。
SELECT SUM(price + freight - discount) AS total_pay FROM orders WHERE user_id = 1001;
这里price加freight减discount得到每行实际支付,SUM把它们全部累计。
三、使用表达式与别名
有时多列求和逻辑复杂,可以先在子查询算好每行小计,外层再聚合,可读性更好。
SELECT SUM(row_total) AS grand_total FROM ( SELECT (price + freight - discount) AS row_total FROM orders ) t;
四、注意事项
- 如果列里包含NULL,SUM会忽略NULL,但加减法里NULL会导致整行表达式为NULL,可用COALESCE处理。
- 不同数据库对SUM返回类型略有差异,大数求和注意溢出问题。
- 聚合函数不能出现在WHERE中,需在HAVING里过滤合计结果。
处理NULL的写法示例
SELECT SUM(COALESCE(price, 0) + COALESCE(freight, 0) - COALESCE(discount, 0)) AS safe_total FROM orders;
多列总和的本质就是列间算术加SUM聚合,理清NULL与数据类型就能写出稳妥的统计SQL。