我有两个月有两个值,例如:
July-2013 1838.08
Aug-2013 3500.08
如何计算 8 月与 7 月的百分比差异?
这个公式很简单(Curr-Prev)*100.0/Prev
,不清楚如何应用它,因为我们不知道你的表定义、内容或键,因此不知道如何一般选择一个月和它的前一个值。但是,硬编码它会是这样的:
SELECT
100.0*(curr.Val - prev.Val) / prev.Val As PercentDiff
FROM yourTable As curr
JOIN yourTable As prev
ON curr.MonthStr = 'Aug-2013' AND prev.MonthStr = 'July-2013'
计算百分比变化的问题是您需要小心“旧值”何时为 0,否则您将收到错误消息。
一种方法是使用 nullif(old_Value, 0) 但问题是当旧值为 0 时,您要求 New_Value/NULL 这是新值。(绝对不是百分比变化)
我像这样解决它:
(case
when
OldValue = 0 and NewValue = 0
then
cast(0 as Decimal(10,2))
when
OldValue = 0
then
'Na'
else
cast(cast(
(
(
(cast(NewValue as decimal(11,3)) -
cast(OldValue as decimal(11,3))
)*100
)/cast(OldValue as decimal(11,3))
) as decimal(20,3)
) as varchar
)
end) '% Change'
我可能投了很多比必要的演员,但它对我很有效。必要时给出 Na,必要时给出 0。
SELECT VAR(Bonus) 'Variance',
STDEVP(Bonus) 'Standard Deviation',
STDEV(Bonus) 'Standard Deviation',
VARP(Bonus) 'Variance for the Population'
FROM Sales.SalesPerson;
赞扬以下职位
为了处理分母中的零,我使用:
case
when oldVal<>0 then ((newVal-oldVal)*100.0)/oldVal
else
case when newVal=0 then 0 else Null end
end
如果 newVal 和 oldVal 都为 0,这将返回 0,如果 oldVal 为零但 newVal 不为零,则返回 Null。
乘以 100.0(而不是 100)将隐式地将 int 字段转换为十进制。我发现它比 try_convert() 更干净。