2013-07-14 4 views
0

나는 잠시 동안이 주제에 대한 연구를 해왔고 다른 주제에 게시 된 해결책 덕분에이 문제를 해결할 수있었습니다.SQL과의 차이 계산

나는 데이터의 열 변화 얻기 위해 시도하고있다 : 행 (N) - (N-1)

update Table tt1 
left outer JOIN Table tt2 
on tt1.name = tt2.name 
and tt1.date-tt2.date=1 
set tt1.delta = (tt1.amount-ifnull(tt2.amount, tt1.amount)); 

출력이

Date  | Value | Delta 
2013-03-30| 38651 | 393 
2013-03-31| 39035 | 384 
2013-04-01| 39459 | 0 
2013-04-02| 39806 | 347 

입니다 행을 당신은 볼 수 있듯이 차이는 4 월 1 일에 계산되지 않습니다 (나머지 값은 정당합니다). 매월 1 일에도 똑같이 발생합니다.

내 생각에 [tt1.date-tt2.date = 1]과 (과) 관련이 있지만 정확히 무엇을 파악할 수없는 것 같습니다.

미리 도움 주셔서 감사합니다.

답변

0

내가 당신의 문을 일부 변경했다 ... 당신의 오류 중 하나는 날짜를 처리 또는 방법으로 당신이를 처리하는 방식에있다 델타 ...

update Table tt1 
left outer JOIN Table tt2 
on tt1.name = tt2.name 
and tt1.date = date_sub(tt2.date, interval 1 day)  
set tt1.delta = case when tt2.amount is not null then tt1.amount - tt2.amount else -1 end; 
+1

해결책 주셔서 감사합니다. 그것은 잘 작동, 나는 '을 추가했다.' tt2.amount로 구문 오류를 피하고 빼기를 tt2.amount - tt1.amount로 변경하십시오. – user2581135

+0

감사합니다. 답변을 수정했습니다. –

0

DATEDIFF 시도하면 두 날짜의 차이가 날 것입니다.

and DATEDIFF(tt1.date,tt2.date) =1 

이 0

그래서 당신이 한달도 한 차이가해야 얻을 이유를 01-31과 그 사실이 아니 그게 전부 differenting 때문이다.

0

날짜가 date으로 저장되지 않고 시간 구성 요소가있는 것 같습니다. 당신은 date로 변환 date()을 사용하거나 datediff() 사용하여이 문제를 가져올 수 있습니다

update Table tt1 left outer JOIN 
     Table tt2 
     on tt1.name = tt2.name and datediff(tt1.date, tt2.date) = 1 
    set tt1.delta = (tt1.amount-ifnull(tt2.amount, tt1.amount)); 
+0

답변 해 주셔서 감사합니다. 쿼리를 테스트 한 결과 완벽하게 작동하는지 확인할 수 있습니다. – user2581135