postgresql group by和inner join

won*_*mer 16 sql postgresql group-by inner-join

我想在SQL它做了查询INNER JOIN,并GROUP 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;
Run Code Online (Sandbox Code Playgroud)

先感谢您!

Rap*_*aus 20

首先,GROUP BY在查询结束时(如果你有一些,就在order by或之前having).

然后,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;
Run Code Online (Sandbox Code Playgroud)

但具有相同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;
Run Code Online (Sandbox Code Playgroud)

  • @Criesto如果你想过滤分组字段,你应该添加一个HAVING子句:`HAVING SUM( payment.amount) > 100`(在group by子句之后) (2认同)

dno*_*eth 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;
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)