2017-09-06 84 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开始 –