Я бы написал так:
select truckid, max(delivery1) as delivery1, max(delivery2) as delivery2
from ((select truckid, count(*) as delivery1, 0 as delivery2
from delivery
where deliverydate >= '2019-01-01' and deliverydate < '2019-01-02'
group by truckid
)
union all
(select truckid, 0, count(*) as delivery2
from delivery2
where deliverydate >= '2019-01-01' and deliverydate < '2019-01-02'
group by truckid
)
) t
group by truckid;
Я думаю, что это самый эффективный подход.
Во-первых, диапазоны дат позволяют использовать индексы.
Во-вторых, group by
в отдельных таблицах относится к данным меньшего размера. GROUP BY
масштабируется хуже, чем линейно, поэтому чем меньше, тем лучше.
UNION ALL
также для меньших данных.
И для удобства прямая условная логика не требуется.