У вас есть индекс для Receive_date
и status
?(не индекс по каждому, вместе взятый)
Также:
- У вас есть 4 касания в таблице, что означает, что запрос будет масштабироваться как минимум O (4n).С помощью COUNT (CASE) вы можете удалить
Delivered
и UnDelivered
подзапросы - Простой подзапрос подсчета также не требуется
- Вам необходим GROUP BY.ВАШЕ ОТЛИЧИЕ - это обходной путь для этого
- МЕЖДУ
>=
и <=
, который обычно не подходит для дат со временем
Я использовал подзапрос здесьдля ясности, но это не имеет значения:
select
DateOnly as Date,
COUNT(*) AS Total,
COUNT(CASE WHEN status='Solved' THEN 1 END) AS Delivered,
COUNT(CASE WHEN status='Pending' THEN 1 END) AS UnDelivered
from
(
SELECT
DateAdd(Day, DateDiff(Day, 0, m.Receive_date), 0) as DateOnly,
status
FROM
Raw_Mats
WHERE
Receive_date >= '2011-07-01' AND Receive_date < '2011-07-21'
) T
GROUP BY
DateOnly
Редактировать, без подзапроса.
Я начал с подзапроса, потому что думал, что он будет более сложным, чем ожидалось, и не потрудился убрать его ...
select
DateAdd(Day, DateDiff(Day, 0, m.Receive_date), 0) as Date,
COUNT(*) AS Total,
COUNT(CASE WHEN status='Solved' THEN 1 END) AS Delivered,
COUNT(CASE WHEN status='Pending' THEN 1 END) AS UnDelivered
from
Raw_Mats
WHERE
Receive_date >= '2011-07-01' AND Receive_date < '2011-07-21'
GROUP BY
DateAdd(Day, DateDiff(Day, 0, m.Receive_date), 0)