Ошибка в том, что ORDER BY и GROUP BY должны идти в обратном порядке.
Для группировки по дате надо так:
SELECT DATE(`date_insert`) AS `date`, SUM(`price`), AVG(`price`), COUNT(*)
FROM `b_sale_order`
WHERE (`canceled` = 'N') AND (`date_insert` BETWEEN :StartD AND :EndD)
GROUP BY `date`
ORDER BY `date`
`id` выбирать бесполезно, он будет взят от первой попавшейся строки в группе. Индекс в GROUP BY и ORDER BY работать не будет, поскольку используется не значение поля, а функция от него.