试图计算月份月份增加/减less的百分比

所以…..第一次很长时间…. 🙂

我正在尝试计算数据行上的Month on Month(月份)变化百分比。 例如,我目前的输出是:

– 不能张贴我的照片

DataDate |LocationId|Payment|MoM [Current placeholder column in script] 12-1-2013|LocationA |$5.00 | 1-1-2014 |LocationA |$10.00 | 2-1-2014 |LocationA |$100.00| 12-1-2013|LocationB |$50.00 | 1-1-2014 |LocationB |$25.00 | 2-1-2014 |LocationB |$50.00 | 

我将结果粘贴到Excel中,然后使用以下公式计算MoM:
((CurrentDataDate Payment / PreviousDataDate Payment)-1)]

我无法弄清楚甚至开始试图完成这个,所以我不能提供任何编码从我已经尝试过…我已经阅读和尝试相关的标量查询用于计算运行总数,并试图改变它来完成这个没有骰子…我尝试了一个Join和一个子查询,但我会承认我的子查询能力还不够。

用来调用这个信息的代码是:

 Declare @BeginDate as DateTime Declare @EndDate as DateTime Set @BeginDate = '12-01-2013' Set @EndDate = '02-01-2014' Select DataDate,LocationId,Payment,0 as MoM From dbo.mytableview Where DataMonth between @BeginDate and @EndDate 

期望的输出是:

 DataDate |LocationId|Payment|MoM 12-1-2013|LocationA |$5.00 | 1-1-2014 |LocationA |$10.00 |1.0 [or 100%] 2-1-2014 |LocationA |$100.00|9.0 [or 900%] 12-1-2013|LocationB |$50.00 | 1-1-2014 |LocationB |$25.00 |-.50 [or -50%] 2-1-2014 |LocationB |$50.00 |1.0 [or 100%] 

我正在使用Microsoft SQLServer 2008 R2 ….我也有/和可以使用2012年版本,如果需要的话。

我相信我已经把事情抛出了,为此,我表示歉意….请让我知道,如果任何额外的信息是必要的…..,并提前感谢!

这适用于SQL Server 2012:

 with x as ( select datadate, locationid, payment, lag(payment) over(partition by locationid order by datadate) as prev_payment from table ) select *, (payment/prev_payment)-1 from x 

这是另一个解决scheme,适用于早期版本:

 select *, (t2.payment/t1.payment)-1 from #t t1 left join #t t2 on datediff(month, t1.datadate, t2.datadate)=1 and t1.locationid = t2.locationid 

但是,对于更大的数据集,这种自连接解决方​​案通常效果不佳,在这种情况下优选游标解决scheme。

尽pipe院长的解决scheme比较好,但我也只是想为完全没有SQL Server 2012的人发布一个解决scheme(因为我已经在dean发布他之前就已经开始了)。

这可以使用公共表expression式和Row_Number()函数来完成:

 WITH CTE AS ( SELECT Row_Number() OVER (PARTITION BY locationid ORDER BY datadate) AS RN, datadate, locationid, payment FROM table ) SELECT CTE2.*, (CTE2.payment / CTE1.payment) - 1 AS MOM FROM CTE AS CTE1 RIGHT OUTER JOIN CTE AS CTE2 ON CTE1.RN = CTE2.RN-1 AND CTE2.locationid = CTE1.locationid ORDER BY locationid