2017-09-06 83 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(兩者都只有1個「物理」文件)。

我使用的語法如下練成我(使用客戶端ID 3和客戶端Id 4爲例)

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

當我把它翻譯到SQL Server 2012,這是行不通的。

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()通過像'情況下在(分區linknumber order by clientid)= 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 

結果

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 

與ROW_NUMBER()的結果

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

真棒!有用。感謝費迪南德的幫助。您能否詳細解釋如何逐步閱讀語法,尤其是使用rnum,Row_Number,partition by?對我來說這真是新鮮事。再次非常感謝你。真的很感激它。 –

+0

正如您在rnum列中所看到的那樣,ROW_NUMBER()根據PARTITION BY linknumber爲每個組創建一個從1開始的行號,並從ORDER BY clientid上的最小值開始以1開始 –