I have two related tables like this:
CREATE TABLE Vehicle (
Id INT NOT NULL PRIMARY KEY,
Name VARCHAR(255) NOT NULL
);
INSERT INTO Vehicle (Id, Name) VALUES (1, 'Car');
INSERT INTO Vehicle (Id, Name) VALUES (2, 'Van');
INSERT INTO Vehicle (Id, Name) VALUES (3, 'Motorcycle');
CREATE TABLE Signal (
Id INT NOT NULL PRIMARY KEY,
VehicleId INT NOT NULL,
Reading INT,
StartTime DATE
);
INSERT INTO Signal (Id, VehicleId, Reading, StartTime) VALUES (1, 1, 10, '2016-12-10');
INSERT INTO Signal (Id, VehicleId, Reading, StartTime) VALUES (2, 1, 15, '2017-01-10');
INSERT INTO Signal (Id, VehicleId, Reading, StartTime) VALUES (3, 1, 4, '2017-02-10');
INSERT INTO Signal (Id, VehicleId, Reading, StartTime) VALUES (4, 2, 4, '2017-03-10');
When I perform an OUTER JOIN like this, it behaves as expected:
SELECT v.Name, SUM(s.Reading)
FROM Signal s
RIGHT OUTER JOIN Vehicle v ON v.Id = s.VehicleId
GROUP BY v.Name
(actual and expected result):
Car | 29
Motorcycle | NULL
Van | 4
But when I add a WHERE condition like this, it no longer does what I expect:
SELECT v.Name, SUM(s.Reading)
FROM Signal s
RIGHT OUTER JOIN Vehicle v ON v.Id = s.VehicleId
WHERE StartTime > '2017-01-01'
GROUP BY v.Name
(actual result):
Car | 19
Van | 4
(expected result):
Car | 19
Motorcycle | NULL
Van | 4
Why do I not get the expected result when I add the WHERE condition, and how do I fix it?