Home > Net >  Get all names of users who have placed car orders totalling more than 40000$
Get all names of users who have placed car orders totalling more than 40000$

Time:07-09

I have the following tables:

Cars (CarID, Colour, Price)
CarOrders(CarID, OrderID, AmountOfCars)
Orders(OrderID, UserID)
Users (UserID, Name)

I'd like to query: all names of users who have placed car orders totalling more than 40000 (also considering amount, if a user buys the same car multiple times), alongside the number of these orders. The desired results format is: (Users.name, Number)

I have tried the following:

SELECT * 
FROM Users
JOIN (
    SELECT a.UserID, SUM(a.AmountOfCars*b.Price) total 
    FROM Orders a 
    JOIN Cars b, ON b.CarID == a.CarID, 
    GROUP BY a.UserID
) c ON c.UserID == c.UserID 
WHERE c.total > 20000

CodePudding user response:

SELECT
    U.Name,
    SUM(C.Price * CO.AmountOfCars) AS 'Price'
FROM Users U
JOIN Orders O ON U.UserID = O.UserID
JOIN CarOrders CO ON CO.OrderID = O.OrderID
JOIN Cars C ON C.CarID = CO.CarID
GROUP BY U.Name
HAVING  SUM(C.Price * CO.AmountOfCars) > 40000

CodePudding user response:

You're referencing columns that don't exist in the tables you specify. The Order table doesn't have CarID or amountOfCars. Those are in CarOrders, you have to join with that to relate orders with cars.

ON c.UserID == c.UserID makes no sense at all, that will always be true. You meant ON Users.UserID = c.UserID.

I recommend using aliases that are more mnemonic than a, b, c, etc. Abbreviations for the table names are better.

SELECT u.name
FROM Users AS u
JOIN (
    SELECT o.UserID
    FROM Orders AS o
    JOIN CarOrders AS co ON co.OrderID = o.OrderID
    JOIN Cars AS c on co.CarID = c.CarID
    GROUP BY o.UserID
    HAVING SUM(co.amountOfCars * c.Price) > 40000
) AS o ON o.UserID = u.UserID
  • Related