postgresql group by和inner join

问题描述 投票:14回答:2

我想在SQL中查询同时执行INNER JOINGROUP BY。我尝试了以下不起作用:

SELECT customer.first_name, SUM(payment.amount)
FROM customer
GROUP BY customer.customer_id
INNER JOIN payment
ON payment.customer_id = customer.customer_id;

先感谢您!

sql postgresql group-by inner-join
2个回答
17
投票

首先,GROUP BY出现在查询的最后(如果你有一些,就在order byhaving条款之前)。

然后,select中不在聚合函数中的所有字段必须在group by子句中。

所以

SELECT customer.first_name, SUM(payment.amount)
FROM customer
INNER JOIN payment
ON payment.customer_id = customer.customer_id
GROUP BY  customer.first_name;

但具有相同first_name的客户将被分组,这可能不是您想要的。

所以相反

SELECT  customer.first_name, SUM(payment.amount)
FROM customer
INNER JOIN payment
ON payment.customer_id = customer.customer_id
GROUP BY  customer.first_name, customer.customer_id;

9
投票

您想按customer_id分组,但获取first_name?

SELECT customer.first_name, SUM(payment.amount)
FROM customer
INNER JOIN payment
ON payment.customer_id = customer.customer_id
GROUP BY customer.customer_id, customer.first_name;

您也可以在派生表中进行聚合,然后您可以从客户那里获得其他列:

SELECT customer.first_name, SumPayment
FROM customer
INNER JOIN 
 (
   SELECT customer_id,
          SUM(payment.amount) AS SumPayment
   FROM payment
   GROUP BY customer_id
 ) AS payment
ON payment.customer_id = customer.customer_id
© www.soinside.com 2019 - 2024. All rights reserved.