Что не так с логикой моего вычисляемого поля (попытка вычислить процент)?
Мой TSQL для вычисления процента, по-видимому, ошибается; это часть моей логики хранимых процедур:
. . .
AVG(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Price ELSE 0 END)
Week1Price,
AVG(CASE WHEN Ind.InvoiceDate BETWEEN @Week2Begin AND @EndDate THEN Ind.Price ELSE 0 END)
Week2Price,
AVG(CASE WHEN Ind.InvoiceDate BETWEEN @Week2Begin AND @EndDate THEN Ind.Price ELSE 0 END)
-
AVG(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Price ELSE 0 END)
PriceVariance,
AVG(CASE WHEN Ind.InvoiceDate BETWEEN @Week2Begin AND @EndDate THEN Ind.Price ELSE 0 END)
-
AVG(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Price ELSE 0 END)
/
NULLIF(AVG(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Price ELSE 0 END),0)
PercentageOfPriceVariance
. . .
Что я хочу сделать с PercentageOfPriceVariance, это:
(Week2Price - Week1Price) / Week1Price
Е. Г., если Week2Price является 3.38, а Week1Price составляет 20,27, затем (Week2Price - Week1Price) должны быть -16.89; и то, что (-16.89), деленное на 3.38 должны быть -4.99.
Заметьте, однако, что результаты, которые я получаю, сильно отличаются от этого (см. строку 3, где % 2.38):Что не так с логикой в моем вычисляемом поле?
1 ответ:
Скобки должны применяться для первого набора ie.,
(Week2Price - Week1Price)
другими словами операция деленияWeek1Price / Week2Price
сначала выполнит операцию минус после этого. Вот почему результат отличается от ваших ожиданий.См. пример:
SELECT (3.38 - 20.27) / NULLIF(3.38, 0) -- result -4.997041 SELECT 3.38 - 20.27 / NULLIF(3.38, 0) -- result -2.617041
Поэтому вам нужно применить скобки для первого набора, чтобы решить проблему.
Примечание: в вашем фактическом коде раздел делителя содержит только
WeeK1Price
, но в посте, который вы упомянули, данные нужно разделить наWeek2Price
.В настоящее время ваш код возвращает неверные данные из-за неправильного делителя.
SELECT 3.38 - 20.27 / NULLIF(20.27, 0) -- result 2.3800000
Таким образом, ваш фактический код должен быть:
( AVG(CASE WHEN Ind.InvoiceDate BETWEEN @Week2Begin AND @EndDate THEN Ind.Price ELSE 0 END) - AVG(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Price ELSE 0 END) ) / NULLIF(AVG(CASE WHEN Ind.InvoiceDate BETWEEN @Week2Begin AND @EndDate THEN Ind.Price ELSE 0 END), 0) PercentageOfPriceVariance