У меня есть этот запрос в T-SQL 2008:
SELECT a.Amount / (
SELECT SUM(b.Amount) FROM Revenue b
WHERE YEAR(b.RevenueDate) = YEAR(a.ExpenseDate)
AND MONTH(b.RevenueDate) = MONTH(a.ExpenseDate)
AND b.HotelKey = a.HotelKey
)
FROM Expense a
Проблема в том, что для завершения запроса требуется слишком много времени. Я думаю, что это вызвано подзапросом «ВЫБЕРИТЕ СУММУ (b.Amount) ОТ Дохода b ...», который выполняется для каждой строки в таблице Расходы.
Как оптимизировать такой запрос? Есть ли лучшая альтернатива для запроса?
РЕДАКТИРОВАТЬ: Извините, я забыл предложение "AND b.HotelKey = a.HotelKey" в подзапросе. Приведенный выше исходный запрос был обновлен.
@ Дэмиен:
Ваш запрос добавлен с помощью присоединения HotelKey:
SELECT
a.Amount / b.Amount
FROM
Expense a
inner join
(SELECT
HotelKey,
DATEADD(month,DATEDIFF(month,0,RevenueDate),0) as MonthStart,
DATEADD(month,1+DATEDIFF(month,0,RevenueDate),0) as MonthEnd,
SUM(Amount) as Amount
FROM
Revenue
GROUP BY
HotelKey,
DATEADD(month,DATEDIFF(month,0,RevenueDate),0),
DATEADD(month,1+DATEDIFF(month,0,RevenueDate),0)
) b
ON
a.ExpenseDate >= b.MonthStart and
a.ExpenseDate < b.MonthEnd
and a.HotelKey = b.HotelKey