2016-06-29 3 views
2

사이트에서 처음으로 명확성이 부족하거나 해결책을 찾지 못한 것에 대해 사과드립니다!T-SQL의 다른 열에서 계산 된 값으로 열 채우기

나는 임시 테이블 (# Temptable3)이 있습니다.보고 할 데이터 세트를 작성하는 데 도움을주기 위해 채워집니다. 나는 약간의 시행 착오를 거쳐 가장 논리적 인 단계들을 풀어 왔고 여기에있는 이전의 질문들에 대한 답을 찾았습니다. (감사합니다!) 그러나이 마지막 비트를 깰 수는 없습니다. 단순화하기 위해, 나는 아래의 샘플 데이터 집합에서 관련성이없는 열을 제거했습니다

내가 현재 가지고 :

RowNumber Increment Score 
----------------------------- 
    1    1  NULL 
    2  100000  NULL 
    3   -1  NULL 
    4    1  NULL 
    5   10  NULL 
    6   -1  NULL 
    7  -100000  NULL 
    8   -10  NULL 

는 무엇을 얻을 것을 목표로하고있어 증분 컬럼의 합계로 채울 점수 열입니다 에 포함 최대가 자신의 행 예입니다 :

RowNumber Increment Score 
----------------------------- 
    1   1   1 
    2  100000  100001 
    3   -1  100000 
    4   1  100001 
    5   10  100011 
    6   -1  100010 
    7 -100000   10 
    8  -10   0 

나는 노력과 자기 조인을 가지고 노는 작업에 대한 다양한 업데이트 문을 가져 오지 못했습니다하지만 유망한 보이는 아무것도 찾을 수 없습니다했습니다. 이것이 정보가 충분하지 않다면 죄송합니다. 필요한 경우 질문하십시오. 모든 도움을 주셔서 감사합니다.

HABO 덕분에 합계 실행에 대한 질문을 찾을 수있는 포인터가 있습니다.

선언 @runningtotal INT 설정 @runningtotal = 0

업데이트 # TempTable3 설정 @runningtotal = 점수 = @runningtotal + 증가 : 이전 질문에 janderssons reply의 링크는 나를 위해 일한 솔루션에 저를 이끌어 #에서

TempTable3

+0

당신이 찾고있는 것을 _ 런닝 합계라고합니다.검색을 조금 더 시도해보십시오. '[tsql] running sum'을 사용합니다. – HABO

답변

2

뭔가 같은 :

SELECT [RowNumber], Increment 
     , SUM(Increment) OVER(ORDER BY [RowNumber]) AS Score 
FROM Your_Table 

트릭을해야합니다. here을 참조하십시오.

향후 독자를 위해 : over 구문은 SQL Server 2012에서 사용할 수 있지만 sum() over()에서는 사용할 수 없습니다. 대체 솔루션 (및 업데이트를위한 더 완벽한 솔루션)은 @JohnCappelletti의 대답을 참조하십시오. HABO에서 포인터

+0

Downvoters는 관심이 있으십니까? – HoneyBadger

+0

IMHO - 익명으로 남겨 두었다고해도 투표를해야합니다. –

+0

@JohnCappelletti 메타에 가져 오기 – Paparazzi

2
Declare @Table table (RowNumber int,Increment int,score int) 
Insert into @Table values 
(1,1,NULL), 
(2,100000,NULL), 
(3,-1,NULL), 
(4,1,NULL), 
(5,10,NULL), 
(6,-1,NULL), 
(7,-100000,NULL), 
(8,-10,NULL) 

Update @Table Set Score=B.Score 
From @Table A 
Join (Select RowNumber,Score=sum(Increment) over (order by RowNumber) from @Table) B 
    on A.RowNumber=B.RowNumber 

Select * from @Table 

또는

UPDATE @Table SET Score=(SELECT SUM(Increment) 
          FROM @Table B 
          WHERE b.RowNumber <= A.RowNumber) 
FROM @Table A 

반환

RowNumber Increment  score 
    1   1   1 
    2   100000  100001 
    3   -1   100000 
    4   1   100001 
    5   10   100011 
    6   -1   100010 
    7   -100000  10 
    8   -10   0 
+0

안녕하세요 John - 신속한 답장을 보내 주셔서 감사합니다. 위의 해결책을 시도해 보았지만 적절하게 표 이름을 대체했지만 메시지가 잘못되었습니다. "주문"근처에 구문이 있습니다. "깨끗한 쿼리 창에 붙여 넣으려고했는데 그대로 실행하고 동일한 메시지가 나타납니다. 관련이 있다면 T-SQL에 있습니까? MS SQL SMS 2008 R2 –

+0

SQL 2008 버전 +? –

+0

테이블의 @ 3 당신이 세 가지? –

1

덕분에 저를 실행 금액에 대한 이전의 질문을 찾을 수 있도록 도와줍니다.

선언이 @runningtotal이 @runningtotal 설정하는 int = 0

업데이트 # TempTable3는 = 점수 = @runningtotal + 증가

을 @runningtotal 설정 : 이전 질문에 janderssons reply의 링크는 나를 위해 일한 솔루션에 저를 이끌어

에서 # TempTable3

내게 힘들었던 HoneyBadger JohnCappelletti에게 다시 한 번 감사드립니다. 아마 내 잘못이라고 생각합니다.

+0

명시 적 순서를 지정하지 않으면 SQL Server는 임의의 순서로 행을 업데이트 할 수 있습니다. John Cappeletti와 같은 솔루션은 합계가 올바른 행을 기반으로 계산되도록합니다. 사용중인 SQL Server의 버전에 따라 ['LAG'] (https://msdn.microsoft.com/en-us/library/hh231256.aspx?f=255&MSPPError=-2147217396)이 유용 할 수 있습니다. 데이터베이스 질문에 소프트웨어와 버전 (예 :'sql-server-2014 ')으로 태그를 지정하면 도움이됩니다. – HABO

관련 문제