DATE(orders.created_at) >= :start
Никогда не использовать условия такого плана. Это прямой запрет использования индекса по created_at, довольно вероятно селективного для этих запросов.
SELECT orders.delivery, SUM(orders.delivery) AS summ
FROM orders
JOIN baskets ON orders.basket_id=baskets.id
WHERE baskets.purchase_status = 3 AND orders.deleted_at IS NULL
AND orders.created_at >= :start AND orders.created_at <= (:finish + interval 1 day)
GROUP BY orders.delivery
И разобрать несколько строк ответа на приложении.
SELECT SUM(if(orders.delivery = "kazpost", orders.delivery,0)) AS kazpost,
SUM(if(orders.delivery = "courier", orders.delivery,0)) AS courier,
SUM(if(orders.delivery = "pickup", orders.delivery,0)) AS pickup
FROM orders
JOIN baskets ON orders.basket_id=baskets.id
WHERE baskets.purchase_status = 3 AND orders.deleted_at IS NULL
AND orders.created_at >= :start AND orders.created_at <= (:finish + interval 1 day)
В одну строку.
Затем смотреть explain