I have 2 tables:
Customer table
CustomerId | FirstName | LastName | Country |
---|---|---|---|
1 | Luís | Gonçalves | Brazil |
2 | Leonie | Köhler | Germany |
3 | François | Tremblay | Canada |
4 | Bjørn | Hansen | Norway |
52 | Emma | Jones | United Kingdom |
53 | Phil | Hughes | United Kingdom |
Invoice table
InvoiceId | CustomerId | Total |
---|---|---|
1 | 2 | 1.98 |
2 | 4 | 3.96 |
3 | 8 | 5.94 |
140 | 52 | 23.76 |
369 | 52 | 13.86 |
283 | 53 | 28.71 |
109 | 53 | 8.91 |
I have to write a query that returns the country along with the top customer and how much they spent. For countries where the top amount spent is shared, provide all customers who spent this amount.
I wrote a query like:
x
SELECT c.CustomerId, c.FirstName, c.LastName, c.Country, SUM(i.Total) AS TotalSpent
FROM Customer c
JOIN Invoice i
ON c.CustomerId = i.CustomerId
GROUP BY c.FirstName, c.LastName
HAVING i.Total >= MAX(i.Total)
ORDER BY c.Country;
the query is not finding the maximum values but it is returning all available values. I am not sure about which DBMS is used as it is my first steps in SQL coding and above example is from Udacity learning platform lab (Maybe it is SQLite that they are using in the lab)
Any help is appreciated. Thank you!
Advertisement
Answer
Below code worked fine to fulfill all the requirements:
WITH tab1 AS
( SELECT c.CustomerId, c.FirstName, c.LastName,c.Country, SUM(i.Total) as TotalSpent
FROM Customer AS c
JOIN Invoice i ON c.CustomerId = i.CustomerId
GROUP BY C.CustomerId
)
SELECT tab1.*
FROM tab1
JOIN
( SELECT CustomerId, FirstName, LastName, Country, MAX(TotalSpent) AS TotalSpent
FROM tab1
GROUP BY Country
)tab2
ON tab1.Country = tab2.Country
WHERE tab1.TotalSpent = tab2.TotalSpent
ORDER BY Country;