2014-03-28 111 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 

然而,這種自連接解決方​​案,一般不要」用較大的數據集表現良好,並且在這種情況下優選遊標解決方案。