이전 행의 값을 기반으로 열을 업데이트하려고합니다. 내 데이터는 다음과 같습니다.
InvID InvAmnt PayAmnt orderId 1 10.00 100.00 12 20.00 100.00 2 3 30.00 100.00 34 40.00 100.00 4
내가하고 싶은 것은 테이블을 업데이트하여의 값 InvAmnt
을 PayAmnt
. 그러나 이전 행도 고려해야합니다. 즉, 첫 번째 행에서 100에서 10을 빼서 90을 얻습니다. 두 번째 행에서는 90 (첫 번째 행의 결과)에서 20을 빼고 결과로 70을 얻습니다. 원하는 출력은 다음과 같습니다.
InvID InvAmnt PayAmnt orderId 1 10.00 90.00 12 20.00 70.00 2 3 30.00 40.00 34 40.00 0.00 4
다음과 같은 창 기능으로 시도했습니다 LAG
.
select ID, InvID, InvAmnt
,LAG(PayAmnt - InvAmnt,1,PayAmnt) OVER (PARTITION BY ID ORDER BY OrderId) - InvAmnt PayAmnt
,orderId
from #payment
order by orderId
그러나 이것은 이전 행이 아닌 마지막 행만 고려하는 결과를 제공합니다.
InvID InvAmnt PayAmnt orderId 1 10.00 90.00 1 1 20.00 70.00 2 1 30.00 50.00 3 1 40.00 30.00 4
여기서 일어나는 일은 첫 번째 행에서 새 값이 원래 PayAmnt (100)에서 InvAmnt (10)을 뺀 값이고 결과적으로 90이됩니다. 두 번째 행에서는 이전 행 PayAmnt (100)에서 InvAmnt (10)을 뺀 InvAmnt (70)를 뺍니다. 결과 70도 정확합니다. 그러나 다음 행에서는 두 번째 행 PayAmnt가 아직 70으로 업데이트되지 않았고 계산이 (100-20)-30이어서 잘못된 50이 발생하기 때문에 실패합니다. 반복 구조없이 어떻게 해결할 수 있습니까?
아래와 같이 sum () 윈도우 함수를 사용할 수 있습니다.
Select *, PayAmnt = sum(InvAmnt) over() - Sum(InvAmnt) over(order by orderId)
from #payment
order by orderId
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다