计算SQL中各行的百分比变化

时间:2016-06-28 23:13:59

标签: sql sql-server

我知道之前已经问过这个问题,但没有一个答案对我有意义。希望有人能够更清楚地解释。

我的数据:

year    quarter month   item    sales   quantity    month_number
2011        1   January    a    4250    85000       1
2011        1   February   a    4600    92000       2
2011        1   March      a    3700    74000       3
2011        2   April      a    4215    84300       4
2011        2   May        a    5120    102400      5
2011        2   June       a    5010    100200      6
2011        3   July       a    4690    93800       7
2011        3   August     a    4900    98000       8
2011        3   September  a    5400    108000      9
2011        4   October    a    5820    116400      10
2011        4   November   a    5900    118000      11
2011        4   December   a    5730    114600      12
2011        1   January    b    1417    35417       1
2011        1   February   b    1533    38333       2
2011        1   March      b    1233    30833       3
2011        2   April      b    1405    35125       4
2011        2   May        b    1707    42667       5
2011        2   June       b    1670    41750       6
2011        3   July       b    1563    39083       7
2011        3   August     b    1633    40833       8
2011        3   September  b    1800    45000       9
2011        4   October    b    1940    48500       10
2011        4   November   b    1967    49167       11
2011        4   December   b    1910    47750       12

我正在尝试在最后创建一个新列,其中包含每个项目(a& b)每个月的销售变化百分比。因此,month_number 1s都是空值,因为没有变化。但是month_number 2应该等于(4600 - 4250)/ 4250,即0.082。 等等。

有什么想法?提前致谢。

2 个答案:

答案 0 :(得分:2)

SELECT
    t1.*
    ,CASE
       WHEN t2.sales IS NULL THEN NULL
       ELSE (t1.sales - t2.sales) / (t2.sales * 1.00)
    END AS MonthOverMonth
FROM
    #TblName t1
    LEFT JOIN #TblName t2
    ON t1.[Year] = t2.[Year]
    AND t1.month_number - 1 = t2.month_number
    AND t1.item = t2.item

Gordon的LAG答案与我想的方式相同,但我正在编写非窗口函数版本,以防你说mysql的东西。无论如何,LAG答案在SQL 2012 +中。 SELECT @@VERSION应告诉您正在使用的MSSQL版本。但即使没有它,你也可以自己加入前一个月并进行计算。

答案 1 :(得分:0)

您尚未使用数据库标记您的问题,因此这符合ANSI标准功能。大多数数据库都支持lag()

select d.*, (sales - prev_sales) / (prev_sales * 1.0)
from (select d.*
             lag(sales) over (partition by item order by year, month) as prev_sales
      from mydata md
     ) d;