Что не так с логикой моего вычисляемого поля (попытка вычислить процент)?


Мой 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 2

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