7

我有两个月有两个值,例如:

July-2013  1838.08
Aug-2013   3500.08

如何计算 8 月与 7 月的百分比差异?

4

4 回答 4

34

这个公式很简单(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'
于 2013-09-10T14:55:54.950 回答
2

计算百分比变化的问题是您需要小心“旧值”何时为 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。

于 2017-10-06T11:15:10.510 回答
0
SELECT VAR(Bonus) 'Variance',
STDEVP(Bonus) 'Standard Deviation',
STDEV(Bonus) 'Standard Deviation',
VARP(Bonus) 'Variance for the Population'
FROM Sales.SalesPerson;

赞扬以下职位

http://blog.sqlauthority.com/2008/01/20/sql-server-introduction-to-statistical-functions-var-stdevp-stdev-varp/

于 2013-09-10T14:33:32.167 回答
0

为了处理分母中的零,我使用:

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() 更干净。

于 2021-08-19T23:01:43.040 回答