我有一张桌子。
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
谢谢你的帮助。
答案 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