使用重复列计数

时间:2017-09-06 00:10:25

标签: sql sql-server duplicates

我有一张桌子。

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提供它们。但是,由于它们是链接,因此两者只有1个ActualFileCount(两者都只有1个“物理”文件)。

我使用下面的语法我excel(使用ClientID 3和ClientId 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

谢谢你的帮助。

1 个答案:

答案 0 :(得分: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
相关问题