我的计算字段的逻辑有什么问题(试图计算百分比)?

时间:2016-01-14 06:09:16

标签: sql-server tsql math stored-procedures percentage

我的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):

enter image description here

我的计算字段中的逻辑有什么问题?

1 个答案:

答案 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