Skip to content

PostgreSQL - SUM 函数

PostgreSQL 的 SUM() 函数是一个聚合函数,用于计算一组值的总和。它通常用于查找数值列的总计,并常与分组结合使用以计算小计。

SUM() 函数的基本语法是:

SELECT SUM(column_name)
FROM table_name
[WHERE condition];

与 GROUP BY 子句一起使用时,语法是:

SELECT group_column, SUM(aggregate_column)
FROM table_name
GROUP BY group_column;

我们将使用之前课程中的同一个 employees 表。如果您没有,可以使用以下脚本创建它:

-- 为保持一致性,重用 employees 表
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
department VARCHAR(50),
salary NUMERIC(10, 2),
hire_date DATE
);
INSERT INTO employees (first_name, last_name, department, salary, hire_date) VALUES
('James', 'Smith', 'Sales', 55000.00, '2021-10-01'),
('Maria', 'Garcia', 'HR', 60000.00, '2020-05-15'),
('David', 'Smith', 'Engineering', 80000.00, '2022-01-20'),
('John', 'Johnson', 'Engineering', 95000.00, '2019-03-12'),
('Patricia', 'Williams', 'Sales', 58000.00, '2021-10-01'),
('Robert', 'Jones', 'Engineering', 80000.00, '2022-02-11'),
('Jennifer', 'Brown', 'HR', NULL, '2023-01-09');

要计算整个公司的总薪水预算,您可以在 salary 列上使用 SUM()。

SELECT SUM(salary) AS total_salary_budget
FROM employees;

请注意使用别名(AS total_salary_budget)为结果列提供描述性名称。查询返回:

total_salary_budget
---------------------
428000.00
(1 row)

SUM() 函数会忽略 NULL 值。在我们的示例中,Jennifer Brown 的 NULL 薪水未包含在计算中。如果 SUM() 的输入集为空(例如,在 WHERE 子句过滤掉所有行之后),它将返回 NULL,而不是零。

SUM() 更强大的用途是计算不同组的小计。让我们找出每个部门的总薪水预算。

SELECT department, SUM(salary) AS department_salary_budget
FROM employees
GROUP BY department
ORDER BY department;

此查询首先按部门对行进行分组,然后对每个组应用 SUM() 函数:

department | department_salary_budget
-------------+--------------------------
Engineering | 255000.00
HR | 60000.00
Sales | 113000.00
(3 rows)

您可以将 SUM() 与 WHERE 子句结合使用来计算数据子集的总和。例如,要查找“Engineering”(工程)部门中薪水超过 80,000 的员工的总薪水:

SELECT SUM(salary) AS high_earner_eng_salary
FROM employees
WHERE department = 'Engineering' AND salary > 80000;

结果:

high_earner_eng_salary
------------------------
95000.00
(1 row)

SUM() 在商业智能和财务报告中是基础性的。例如,在 sales(销售)表中,您可以使用它来计算:

  • 上季度的总收入:SELECT SUM(amount) FROM sales WHERE sale_date >= 'YYYY-MM-DD';
  • 每个产品类别的总销售额:SELECT category, SUM(revenue) FROM sales GROUP BY category;
  • 收入超过 100 万美元的区域的总销售额:SELECT region, SUM(revenue) FROM sales GROUP BY region HAVING SUM(revenue) > 1000000;
postgresql_useful_functions.htm