Sql 计算表上行之间的百分比差异

Sql 计算表上行之间的百分比差异,sql,sql-server,Sql,Sql Server,我有一个表格,我想计算一组账号、福利和年份的行之间的百分比差异。我正在使用SQL 2008 前例 AccountNbr Benefit Year Month Value Diff ------------ ------- ---- ----- ----- ---- 123 A 2014 11 10 123 A 2014 12 20 123 A 2015

我有一个表格,我想计算一组账号、福利和年份的行之间的百分比差异。我正在使用SQL 2008

前例

AccountNbr    Benefit   Year Month Value  Diff
------------  -------   ---- ----- -----  ----
123           A         2014 11    10   
123           A         2014 12    20
123           A         2015 1     10   
123           A         2015 2     20
123           A         2015 3     40
123           B         2015 1     50
123           B         2015 2     100
123           B         2015 3     150
后面的示例(我想看到的)


假设您每年/每月都有一行,您可以进行自加入:

select t1.*
  ,coalesce(100*(t1.value - t2.value) / t2.value, 0)
from tab as t1 
left join tab as t2
  on t1.AccountNbr = t2.AccountNbr
 and t1.Benefit = t2.Benefit
 and t1.year  = case when t2.month < 12 then t2.year else t2.year +1 end
 and t1.month = case when t2.month < 12 then t2.month +1 else 1 end
选择t1*
,聚结(100*(t1.value-t2.value)/t2.value,0)
从制表符到t1
左连接选项卡为t2
在t1.AccountNbr=t2.AccountNbr上
t1.效益=t2.效益
t1.year=t2.month<12时的情况,然后t2.year,否则t2.year+1结束时的情况
t1.month=当t2.month<12时,则t2.month+1,否则1结束

如果缺少一个月,这将再次返回零。

您可以使用
行编号()
来标识每个
帐户、福利
分区中的前一行。然后,您可以
左键连接上一行,并计算百分比差异(如果这是您真正想要的!):


SQL Server上的版本是什么?在示例中添加一个2014 12行,只是为了让它更安全一点。与“运行总计”相同,它只做百分比差异而不是求和。@TabAlleman:SS 2008不支持运行总计:-(它不是内置的,但如果您在google上搜索“如何在SQL Server 2008中进行运行总计”有很多例子。
select t1.*
  ,coalesce(100*(t1.value - t2.value) / t2.value, 0)
from tab as t1 
left join tab as t2
  on t1.AccountNbr = t2.AccountNbr
 and t1.Benefit = t2.Benefit
 and t1.year  = case when t2.month < 12 then t2.year else t2.year +1 end
 and t1.month = case when t2.month < 12 then t2.month +1 else 1 end
;WITH CTE AS (
   SELECT AccountNbr, Benefit, Year, Month, Value,
          ROW_NUMBER() OVER (PARTITION BY AccountNbr, Benefit 
                             ORDER BY Year, Month) AS rn
   FROM mytable
 )
 SELECT c1.AccountNbr, c1.Benefit, c1.Year, c1.Month, c1.Value,             
        CAST(COALESCE (((c1.Value - c2.Value) * 1.0 / c2.Value) * 100, 0) AS INT) AS Diff
 FROM CTE AS c1
 LEFT JOIN CTE AS c2 
 ON c1.AccountNbr = c2.AccountNbr AND c1.Benefit = c2.Benefit AND c1.rn = c2.rn + 1