2014-03-28 2 views
1

..... 처음 오랜 시간 .... :)월별 월별 비율 백분율 계산 시도

데이터 월의 월별 변동 %를 계산하려고합니다. 예를 들어 내 전류 출력은 다음과 같습니다
((CurrentDataDate : 나와 함께

--Cant 포스트의 이미지가 너무 베어 나는 Excel로 결과를 붙여 넣기 한 후 다음 공식을 사용하여 전월 계산하고

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 | 

지불/PreviousDataDate 지불) -1)]

내가 이것을 시도하기 시작하는 곳을 알아낼 수 없기 때문에 내가 시도한 것에서 어떤 코딩도 제공 할 수 없다 ... 나는 상관 스칼라 쿼리를 읽었으며 시도했다. 누적 합계를 계산하는 데 사용하고 이것을 달성하기 위해 변경하려고했습니다. .. 주사위 ... 조인과 하위 쿼리로 시도했지만 하위 쿼리 능력이 적정하지 않다는 것을 인정합니다.

이 정보를 호출하는 데 사용되는 코드는 다음과 같습니다

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 

원하는 출력은 다음과 같습니다 내가있는 Microsoft SQLServer 2008을 사용하고

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%] 

R2는 .... 나는 또한이 /하고 사용할 수 있습니다 2012 버전이 필요한 경우

나는 물건을 내놨다. 나는 사과한다. .... 추가 정보가 필요하면 알려 주시고 미리 감사드립니다!

답변

1

이 2012 SQL 서버에서 작동 :

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

@ JohnBustos _ "필요한 경우 2012 버전을 사용할 수도 있습니다."_ : – dean

+0

신사와 학자 .... 완벽하게 작동하며 크게 감사드립니다! – Ridiculoushavoc

0

학장의 솔루션은, 그냥도 완전성 '을 위해 SQL 서버 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 

그러나,이 '돈 일반적으로 솔루션을 자체 조인 더 큰 데이터 세트를 사용하면 성능이 좋으며 커서 솔루션이 선호됩니다.