2016-01-14 65 views
2

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

什麼是錯在我的計算字段的邏輯是什麼?

回答

3

小括號應該適用於第一組,即(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