Не зная, какую базу данных вы используете, вот рабочая версия для mssql.
Я на самом деле перестроил таблицы, чтобы убедиться, что они правильные.
Для других систем баз данных вам, вероятно, придется использовать другую функцию, чем ISNULL
в операторе SELECT.
SELECT tt.shop_person,
tt.shop_building,
SUM(tt.shop_time) AS shoptime,
ISNULL(SUM(tz.banana_amount), 0) AS bananas
FROM dbo.shopping tt
INNER JOIN dbo.buildings tu ON tt.shop_building = tu.building_id
LEFT OUTER JOIN
(SELECT banana_person, banana_building, SUM(banana_amount) AS banana_amount
FROM bananas
GROUP BY banana_person, banana_building) tz
ON tt.shop_person = tz.banana_person AND tt.shop_building = tz.banana_building
WHERE (tu.building_city = 'London')
GROUP BY tt.shop_person, tt.shop_building
Мне пришлось добавить агрегатную функцию около tz.banana_amount
- какая (SUM, MIN, MAX) не имеет значения.
Результат:
shop_person shop_building shoptime bananas
Brian 1 40 0
Tom 1 20 1
Brian 3 30 1
Я играл с разными суммами в bananas
и т. Д., И это работает правильно.