PostgreSQL GROUP BY 语句用法详解

在 PostgreSQL 中,GROUP BY语句用于将查询结果按照一个或多个列进行分组,并且可以结合聚合函数(如SUMCOUNTAVGMAXMIN等)对每个分组进行计算。下面详细介绍GROUP BY语句的用法:

基本语法

SELECT column1, aggregate_function(column2)
FROM table_name
WHERE condition
GROUP BY column1;

在上述语法中:

  • column1:用于分组的列。
  • aggregate_function(column2):对分组后的column2应用聚合函数,如SUM(column2)COUNT(column2)等。
  • table_name:要查询的表名。
  • condition:可选的过滤条件,用于筛选符合条件的行。

示例数据

为了更好地说明GROUP BY的用法,假设有一个名为orders的表,包含以下列:order_idcustomer_idorder_dateamount。表中数据如下:
 
CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    customer_id INT,
    order_date DATE,
    amount DECIMAL(10, 2)
);

INSERT INTO orders (customer_id, order_date, amount)
VALUES
    (1, '2023-01-01', 100.00),
    (2, '2023-01-02', 200.00),
    (1, '2023-01-03', 150.00),
    (2, '2023-01-04', 250.00);

示例

1. 按customer_id分组,统计每个客户的订单总金额

SELECT customer_id, SUM(amount) AS total_amount
FROM orders
GROUP BY customer_id;

在这个示例中,GROUP BY customer_id将数据按照customer_id进行分组,然后使用SUM(amount)计算每个分组的订单总金额。

2. 按customer_idorder_date分组,统计每个客户每天的订单总金额

SELECT customer_id, order_date, SUM(amount) AS daily_total
FROM orders
GROUP BY customer_id, order_date
ORDER BY customer_id, order_date;

在这个示例中,GROUP BY customer_id, order_date将数据按照customer_idorder_date进行分组,然后使用SUM(amount)计算每个分组的订单总金额。ORDER BY语句用于按customer_idorder_date排序结果。

3. 使用HAVING子句过滤分组结果

HAVING子句用于在分组后过滤分组结果,它与WHERE子句的区别在于,WHERE子句用于在分组前过滤行,而HAVING子句用于在分组后过滤分组。
 
SELECT customer_id, SUM(amount) AS total_amount
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > 200;

在这个示例中,HAVING SUM(amount) > 200过滤掉总金额小于等于 200 的分组,只返回总金额大于 200 的分组。

注意事项

  • SELECT列表中,除了聚合函数外,所有列都必须包含在GROUP BY子句中。
  • GROUP BY子句必须位于WHERE子句之后,ORDER BY子句之前。
  • HAVING子句只能用于过滤分组结果,不能用于过滤行。

通过以上示例,你可以了解GROUP BY语句的基本用法和常见应用场景。在实际使用中,你可以根据需要灵活组合GROUP BY、聚合函数和HAVING子句来实现复杂的查询。

posted on 2025-03-28 11:16  数据与人文  阅读(142)  评论(0)    收藏  举报