我的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):
我的计算字段中的逻辑有什么问题?
答案 0 :(得分:3)
括号应该适用于第一组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