просто добавьте подзапрос, чтобы заполнить недостающие элементы, затем используйте условные выражения для заполнения пустых полей.Приведенный ниже запрос соответствует условиям, заданным в вашем вопросе.
Помните, что в «живой» системе я бы не просто искал max (final_stock) на любую конкретную дату в качестве элемента «final_stock».Если предполагается, что 'entry_time' - самая последняя запись для данного товара, я бы повторно обработал этот запрос, чтобы использовать его в качестве самой последней 'записи инвентаря' для ссылки.Но при этом открывается вопрос о том, разрешено ли кому-либо в вашей системе обновлять записи инвентаризации.
SELECT
ifnull(C.date,(SELECT max(date) FROM inventory)) AS date,
C.material,
ifnull(max(D.final_stock),0) AS final_stock
FROM (
SELECT
max(B.date) AS date,
A.material
FROM materials A LEFT JOIN inventory B ON A.material = B.material
GROUP BY A.material
) AS C LEFT JOIN inventory D ON C.material=D.material AND C.date = D.date
GROUP BY C.material,C.date
ORDER BY C.material,C.date
результаты ниже
date material final_stock
2018-05-18 Lily - Blue 90
2018-05-18 Lily - Orange 0
2018-05-18 Lily - White 10
2018-05-18 Rose - Blue 0
2018-05-18 Rose - Orange 0
2018-05-18 Rose - White 0
Если вам разрешено использоватьполе entry_time, тогда запрос ниже является лучшим решением.Этот запрос также больше не должен использовать агрегирование во внешнем запросе.Результат для вашего набора данных такой же.
SELECT
ifnull(D.date,(SELECT max(date) FROM inventory)) AS date,
C.material,
ifnull(D.final_stock,0) AS final_stock
FROM (
SELECT
max(B.entry_time) as entry_time,
A.material
FROM materials A LEFT JOIN inventory B ON A.material = B.material
GROUP BY A.material
) AS C LEFT JOIN inventory D ON
C.material=D.material AND
C.entry_time = D.entry_time
ORDER BY C.material