我计算字段的逻辑有什么问题(试图计算百分比)?
What is wrong with my calculated field's logic (trying to compute 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):
我计算字段的逻辑有什么问题?
括号应该适用于第一个集合,即 (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
,但在 post 中您提到数据需要除以 Week2Price
。
当前您的代码 returns 由于错误的除数导致数据错误。
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
我用来计算百分比的 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):
我计算字段的逻辑有什么问题?
括号应该适用于第一个集合,即 (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
,但在 post 中您提到数据需要除以 Week2Price
。
当前您的代码 returns 由于错误的除数导致数据错误。
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