2017-09-06 5 views
0

아래 표가 있습니다.중복 열을 사용하여 계산

ClientID | FileCount | LinkNumber | ActualFileCount | 
----------|-----------|------------|-----------------| 
1   | 1   | 0   | 1    | 
----------|-----------|------------|-----------------| 
2   | 1   | 0   | 1    | 
----------|-----------|------------|-----------------| 
3   | 2   | 0   | 2    | 
----------|-----------|------------|-----------------| 
4   | 1   | 123  | 1    | 
----------|-----------|------------|-----------------| 
5   | 1   | 123  | 0    | 
----------|-----------|------------|-----------------| 
6   | 2   | 456  | 2    | 
----------|-----------|------------|-----------------| 
7   | 2   | 456  | 0    | 
----------|-----------|------------|-----------------| 
8   | 2   | 456  | 0    | 
----------|-----------|------------|-----------------| 
9   | 1   | 789  | 1    | 
----------|-----------|------------|-----------------| 
10  | 1   | 789  | 0    | 

기본적으로 LinkNumber가 0이면 FileCount 열을 ActualFileCount 열로 복사하십시오. 그러나 LinkNumber가 0이 아닌 경우 ActualFileCount는 해당 LinkNumber와 관련된 단일 값이어야합니다.

예를 들어 ClientID 4와 5는 남편과 아내이므로 둘 다 연결합니다. 시스템은 각 FileCount 1을 제공합니다. 그러나 링크이므로 둘 모두에 대해 하나의 ActualFileCount 만 있습니다 (둘 다 '실제 파일'만 있습니다). 내가 SQL 서버 2012로 번역 할 때 내가

If (LinkNumber = 0 then FileCount else 
(If (LinkNumber for ClientID 4 = LinkNumber for ClientID 3 then 0 else FileCount) 

(된 ClientID 3 clientid는 4 예를 사용하여) 엑셀 이하

내가 구문을 사용, 작동하지 않습니다.

select ClientID, file_count, LinkNumber, 

If LinkNumber = 0 then file_count 
else If LinkNumber + 1 = LinkNumber Then 0 else FileCount 
end 

as ActualFileCount 

from TableA 

order by LinkNumber asc 

여러분 께 감사드립니다.

+0

나는 당신이 (파티션 이상의 경우'같은 linknumber = 0 또는 ROW_NUMBER()로 찾고있을 수도 있습니다 추측 clientid에 의해 linknumber 순서) = 1 then file_count else 0 end'? – ZLK

답변

2
SELECT clientid, 
     filecount, 
     linknumber, 
     CASE WHEN linknumber = 0 OR rnum = 1 
      THEN filecount 
      ELSE 0 
     END actualfilecount 
    FROM (SELECT *, 
       ROW_NUMBER() OVER (PARTITION BY linknumber ORDER BY clientid) rnum 
      FROM t_client 
     ) t 

결과 ROW_NUMBER()의 결과에

clientid filecount linknumber actualfilecount 
1   1   0   1 
2   1   0   1 
3   2   0   2 
4   1   123   1 
5   1   123   0 
6   2   456   2 
7   2   456   0 
8   2   456   0 
9   1   789   1 
10   1   789   0 

clientid filecount linknumber actualfilecount rnum 
1   1   0   1    1 
2   1   0   1    2 
3   2   0   2    3 
4   1   123   1    1 
5   1   123   0    2 
6   2   456   2    1 
7   2   456   0    2 
8   2   456   0    3 
9   1   789   1    1 
10   1   789   0    2 
+0

굉장! 그것은 작동합니다. 도움을 주신 Ferdinand에게 감사드립니다. 구문을 단계적으로 읽는 방법을 친절하게 설명해 주시겠습니까? 특히 rnum, Row_Number, partition by? 그것은 정말 새로운 것입니다. 다시 한번 감사드립니다. 정말 감사합니다. –

+0

rnum 열에서 볼 수 있듯이 ROW_NUMBER()는 PARTITION BY linknumber를 기반으로 각 그룹에 대해 1부터 시작하는 행 번호를 생성하고 ORDER BY clientid에서 가장 작은 값에서 1부터 시작합니다 –

관련 문제