九月 7, 2023
摘要:在本教程中,您将学习如何使用 PostgreSQL 的SUM()函数来计算一组值的总和。
目录
PostgreSQL SUM() 函数简介
PostgreSQL 的SUM()是一个聚合函数,返回全部值或不同值的总和。
SUM()函数的语法如下:
SUM(DISTINCT expression)
SUM()函数忽略NULL. 这意味着SUM()在计算时不考虑NULL。
如果使用DISTINCT选项,SUM()函数将计算不同值的总和。
例如,如果没有DISTINCT选项,对 1、1、8 和 2 应用SUM()将返回 12。当带有DISTINCT选项时,对 1、1、8 和 2 应用SUM()将返回 11 (1 + 8 + 2)。它忽略了一个重复值 (1)。
如果在SELECT语句中使用SUM函数,则在SELECT语句不返回行的情况下,它返回NULL,而不是零。
PostgreSQL SUM() 函数示例
我们将使用示例数据库中的payment表来演示SUM函数的功能。

1) 在 SELECT 语句中使用 SUM() 函数的示例
以下语句使用SUM()函数计算 ID 为 2000 的客户的总付款。
SELECT SUM (amount) AS total
FROM payment
WHERE customer_id = 2000;
total
-------
null
(1 row)
由于payment表中没有行的customer_id列值为 2000,因此SUM()函数返回NULL。
在没有找到匹配行的情况下,如果您希望SUM()函数返回零,而不是返回NULL,则可以使用COALESCE函数。
该COALESCE()函数返回第一个非空参数。换句话说,如果第一个参数是NULL,则返回第二个参数。
以下查询说明了如何结合COALESCE()函数使用SUM()函数:
SELECT
COALESCE(SUM(amount),0) AS total
FROM
payment
WHERE
customer_id = 2000;
total
-------
0
(1 row)
2) 将 SUM() 函数与 GROUP BY 子句一起使用
要计算每个组的汇总,您可以使用GROUP BY子句将表中的行分组并将SUM()函数应用于每个组。
以下示例使用带有GROUP BY子句的SUM()函数来计算每个客户支付的总金额:
SELECT
customer_id,
SUM (amount) AS total
FROM
payment
GROUP BY
customer_id
ORDER BY total;

以下查询返回支付最多的前五个客户:
SELECT
customer_id,
SUM (amount) AS total
FROM
payment
GROUP BY
customer_id
ORDER BY total DESC
LIMIT 5;

3) 将 SUM 函数与 HAVING 子句一起使用
要根据特定条件过滤组的总和,请在HAVING子句中使用SUM函数。
以下示例返回支付超过 200 美元的客户:
SELECT
customer_id,
SUM (amount) AS total
FROM
payment
GROUP BY
customer_id
HAVING SUM(amount) > 200
ORDER BY total DESC

4) 将 SUM 函数与表达式一起使用
请查看示例数据库中的rental表,如下:

以下语句使用SUM()函数计算总租赁天数:
SELECT SUM(return_date - rental_date )
FROM rental;
sum
-------------------------
71786 days 190098:21:00
(1 row)
怎么运行的。
- 首先,通过归还日期减去租赁日期来计算租赁期限。
- 其次,将
SUM()函数应用于表达式。
以下示例使用SUM()函数计算客户的总持续时间:
SELECT first_name || ' ' || last_name full_name,
SUM(return_date - rental_date ) rental_duration
FROM rental
INNER JOIN customer USING(customer_id)
GROUP BY customer_id
ORDER BY full_name;

总结
- 使用
SUM()函数计算值的总和。 - 使用
DISTINCT选项计算不同值的总和。 - 使用带有
GROUP BY子句的SUM()函数来计算每个组的总和。
了解更多
PostgreSQL 教程:聚合函数
PostgreSQL 文档:聚集函数