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