2014-03-28 112 views
1

因此.....第一次很长时间.... :)试图计算月份月份百分比增加/减少

我试图计算月份在数据行%变化%。例如我的电流输出为:

--Cant后的图像对我是如此裸露

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,然后使用下列公式计算的月环比:
((CurrentDataDate付款/以前的数据日期付款)-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%] 

我使用微软的SQLServer 2008 R2 ....我也有/并且可以使用2012年版本,如果需要的话。

我相信我已经把事情抛出了,为此我表示歉意....请让我知道是否需要任何其他信息.....并且提前致谢!

回答

1

这工作的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 
+0

**非常酷的答案,但滞后只是在SQL Server 2012 :( –

+1

@JohnBus​​tos _“我也有/和可以使用2012版本,如果需要的话。”_ :) – dean

+0

你先生是一个绅士和学者....完美的作品,我很感激! – Ridiculoushavoc

0

尽管院长的解决方案是更好的,我只是想还专为不具有SQL Server 2012完整起见人的解决方案(因为我在院长发布他之前已经开始了)。

这可以通过使用通用表表达式和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 
+0

在2008 R2完美工作.....谢谢十亿!!!! – Ridiculoushavoc

0

这里的另一种解决方案,适用于早期版本:

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 

然而,这种自连接解决方​​案,一般不要”用较大的数据集表现良好,并且在这种情况下优选游标解决方案。