Postgresql группа и внутреннее соединение

Мне нужен запрос в 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;

Заранее благодарю вас!

Ответ 1

Во-первых, 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;

Но клиенты с одинаковым именем 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;

Ответ 2

Вы хотите сгруппировать по 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