SQL newbie here, I am trying to have the table print out the sum of the wages, make, and car model for all the people that own a particular make/model combination. As of right now, the table prints out all the Car Make and Model values, but the SumWage column is all NULL. The SumWage should return the total sum of all the wages of people who have the Make/Model combination.(My select statement is all the way at the bottom of the code)? All advice is much appreciated!
IF OBJECT_ID ('Person', 'U') IS NULL BEGIN CREATE TABLE Person ( ID INT NOT NULL PRIMARY KEY, Name VARCHAR(32), BirthDate DATETIME ); INSERT INTO Person ( ID, Name, BirthDate ) VALUES (311113, 'Dan Lu', '01-22-33'), (123456, 'Seven Durant', '07-22-94'), (100100, 'Choochootrain Lu', '12-17-56'), (106542, 'Spider Ru', '07-22-36'), (101010, 'Ru Ru', '04-30-84'); END IF OBJECT_ID ('Job', 'U') IS NULL BEGIN CREATE TABLE Job ( ID INT NOT NULL PRIMARY KEY, Company VARCHAR(64), Wage FLOAT, PersonID INT FOREIGN KEY REFERENCES Person(ID) ); INSERT INTO Job ( ID, Company, Wage, PersonID ) VALUES (01, 'Space Pizza Space', 1000.00, 311113), (02, 'Bread', 46.44, 101010), (03, 'Delivery Service', 400.99, 100100), (04, 'Nike', 999900.01, 106542), (05, 'Old McDonald', 6500210.77, 123456); END IF OBJECT_ID ('Car', 'U') IS NULL BEGIN CREATE TABLE Car ( ID INT NOT NULL PRIMARY KEY, Make VARCHAR(32), Model VARCHAR(32) ); INSERT INTO Car ( ID, Make, Model ) VALUES (1234, 'Lexus', 'SE'), (4444, 'Tesla', 'X'), (5007, 'Chevy', 'Cobalt'), (7771, 'Ford', 'Runner'), (6459, 'Toyota', 'Camry'); END IF OBJECT_ID ('PersonCar', 'U') IS NULL BEGIN CREATE TABLE PersonCar ( ID INT, PersonID INT FOREIGN KEY REFERENCES Person(ID), CarID INT ); INSERT INTO PersonCar ( ID, PersonID, CarID ) VALUES (1, 311113, 1234), (2, 123456, 4444), (3, 100100, 5007), (4, 106542, 7771), (5, 101010, 6459); END SELECT SUM(Wage) AS SumWages, Car.Make, Car.Model FROM Person INNER JOIN PersonCar ON PersonCar.ID = Person.ID INNER JOIN Job ON Job.PersonID = PersonCar.ID Right JOIN Car ON Car.ID = Person.ID GROUP BY Wage, Make, Model;
Advertisement
Answer
I think that you want:
SELECT SUM(j.Wage) AS SumWages, c.Make, c.Model FROM Car c LEFT JOIN PersonCar pc ON pc.CarID = c.ID LEFT JOIN Job j ON j.PersonID = pc.PersonID GROUP BY c.Make, c.Model;
This selects all Car
s, and follows the relationships towards the Job table, that contains the Wage
of each car owner. Data is aggregated by car model and model, and the corresponding wages are sumed.
When a given make/model tuple has no car owner, the sum comes out as null
(if you want to just remove these rows from the resultset, use INNER JOIN
s instead of LEFT JOIN
s).
Note that you don’t need to bring the Person
table to get this resultset.