大家好我有一个SQL查询
SELECT FKid1, FKID2, a, b, c
from [source]
where FKID1 = 3
返回以下数据集 (希望格式化)
FKID1 FKID2 A B C
3 40297 0 0 2
3 40297 0 100 1
3 40325 0 0 2
3 40325 0 0 3
3 40325 0 10 -1
3 40348 0 10 3
3 40391 0 10 -1
3 40392 0 10 -1
3 40501 0 10 -1
3 40501 0 0 2
我正在尝试改进此查询,以便如果有2行具有重复的FKID1和FKID2值,它将从特定行中选择列B值,如下所示...
如果有一行C = -1,则使用此行中的B值并忽略其他行。 如果有2行C<> -1然后选择MAX(B)值。 对于不重复的行,请恢复正常。
IE结果应该如下......
FKID1 FKID2 A B C
3 40297 0 100 1
3 40325 0 10 -1
3 40348 0 10 3
3 40391 0 10 -1
3 40392 0 10 -1
3 40501 0 10 -1
为B列选择的正确值,没有傻瓜。
我们现在有一个解决方案,但我认为它过于复杂,并想知道是否有人有任何想法?
感谢。
答案 0 :(得分:4)
单程
;WITH cte As
(
SELECT FKid1, FKID2, a, b, c,
ROW_NUMBER() OVER (PARTITION BY FKID1, FKID2
ORDER BY CASE WHEN C = -1 THEN 0 ELSE 1 END ASC, B DESC) AS RN
from [source]
where FKID1 = 3
)
SELECT FKid1, FKID2, a, b, c
FROM cte
WHERE RN=1
答案 1 :(得分:1)
Select T1.FKID1, T1.FKID2
, Min(A) As A
, Case
When Count(*) = 2 And NegCB.B Is Not Null Then Max(NegCB.B)
Else Max(B)
End As B
, Min(C) As C
From Source As T1
Outer Apply (
Select T3.B
From Source As T3
Where T2.FKID1 = T1.FKID1
And T2.FKID2 = T1.FKID2
And T2.C = -1
) As NegCB
Where FKID1= 3
Group By T1.FKID1, T1.FKID2