2014-07-04 42 views
7

Chcę zapytania w SQL, który ma INNER JOIN i GROUP BY w tym samym czasie. Wypróbowałem następujące, które nie działa:Grupa postgresql przez i dołączyć wewnętrznie

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

Z góry dziękuję!

Odpowiedz

8

Najpierw GROUP BY pojawia się na końcu zapytania (tuż przed klauzulami order by lub having, jeśli masz jakieś).

Następnie wszystkie pola w selekcji, które nie są funkcją agregującą, muszą być w klauzuli group by.

tak

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

Ale klienci z tego samego first_name będą grupowane, który prawdopodobnie nie jest naprawdę to, co chcesz.

więc raczej

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; 
+1

Dziękuję, że to, co szukałem! Poradnik [postgres tutorial] (http://www.postgresqltutorial.com/postgresql-group-by/) zmieszał mnie, ponieważ mówią, że musisz umieścić klauzulę "GROUP BY" zaraz po "FROM" lub "WHERE". . – wonderbummer

7

Chcesz grupy przez customer_id, ale uzyskać 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; 

Można również zrobić agregację w tabeli pochodnej, a następnie można uzyskać dodatkowe kolumny z klientem:

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