@Eytmarin

Можно ли как-то оптимизировать данную хранимую процедуру?

Можно ли как-то оптимизировать данную хранимую процедуру?

CREATE PROCEDURE  pr_КолебанияСпросаТоваров
@Интервал INT, @ТипРезультата INT, @Имя VARCHAR(50) OUTPUT, @Итог NUMERIC (12,3) OUTPUT
  AS
  DECLARE @Code INT
	IF @ТипРезультата = 1
		SELECT @Code=КодТовара, @Итог=SUM(Количество)
		FROM Заказ
		WHERE ДатаЗаказа BETWEEN GetDate()-@Интервал AND GetDate()
		GROUP BY КодТовара
		ORDER BY SUM(Количество)
	ELSE
		SELECT @Code=КодТовара, @Итог=SUM(Количество)
		FROM Заказ
		WHERE ДатаЗаказа BETWEEN GetDate()-@Интервал AND GetDate()
		GROUP BY КодТовара
		ORDER BY SUM(Количество) DESC
	SELECT @Имя = Наименование
	FROM Товар 
	WHERE КодТовара = @Code
  GO


В частности вот это

IF @ТипРезультата = 1
		SELECT @Code=КодТовара, @Итог=SUM(Количество)
		FROM Заказ
		WHERE ДатаЗаказа BETWEEN GetDate()-@Интервал AND GetDate()
		GROUP BY КодТовара
		ORDER BY SUM(Количество)
	ELSE
		SELECT @Code=КодТовара, @Итог=SUM(Количество)
		FROM Заказ
		WHERE ДатаЗаказа BETWEEN GetDate()-@Интервал AND GetDate()
		GROUP BY КодТовара
		ORDER BY SUM(Количество) DESC
  • Вопрос задан
  • 62 просмотра
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SELECT @Code=t1.КодТовара, @Итог=t1.Количество, @Имя=t2.Наименование
  FROM (
    SELECT КодТовара, SUM(Количество) AS Количество
      FROM Заказ
      WHERE ДатаЗаказа BETWEEN GetDate()-@Интервал AND GetDate()
      GROUP BY КодТовара
  ) AS t1
  JOIN Товар AS t2
    ON t2.КодТовара = t1.КодТовара
  ORDER BY t1.Количество * IF(@ТипРезультата = 1, 1, -1)
Ответ написан
LaRN
@LaRN
Senior Developer
Судя по запросу:
SELECT @Code=КодТовара, @Итог=SUM(Количество)
FROM Заказ
WHERE ДатаЗаказа BETWEEN GetDate()-@Интервал AND GetDate()
GROUP BY КодТовара
ORDER BY SUM(Количество)

У вас может вернуться много строк, но так вы это все в переменные начитываете, то все равно останется только одно последнее по порядку сортировки значение, т.е. товар с максимальным или минимальным значением SUM(Количество), т.е. можно попробовать использовать агрегирующую функцию на SUM(Количество).

Также в запросе используется GetDate(), и если предположить, что в таблице нет записей с датой превосходящей GetDate(), то можно делать проверку на открытый диапазон, т.е.
ДатаЗаказа >= GetDate()-@Интервал.

Итого, можно так попробовать:
WITH Q AS  
(SELECT КодТовара, SUM(Количество) as Сумм
   FROM Заказ
  WHERE ДатаЗаказа >= GetDate()-@Интервал
  GROUP BY КодТовара)
SELECT @Code = Q.КодТовара, 
       @Итог = Q.Сумм
  FROM Q
 WHERE Q.Сумм = (SELECT CASE WHEN @ТипРезультата = 1 
                              THEN MAX(Q.Сумм) 
                              ELSE MIN(Q.Сумм) 
                         END
                   FROM Q)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы