A | B | C | D | E
a y 6 12 21
b n 3 10 5
c n 4 12 12
c n 7 12 2
c y 1 12 22
d n 6 10 32
d n 7 10 32
输出表:
A | B | C | F
a y 6 21
b n 3 12
c y 1 22
d n 6 10
我有一个包含某些字段的表。从该表我想删除A中的重复记录并生成输出表。
现在,当A中的记录没有重复时,字段F是根据字段C计算的。因此,如果A中只有一个a的记录,那么如果C> 5,那么F列(输出表) )拉出E栏中的记录。因此,如果记录b在字段C中具有值<5,则F列(输出表)将拉出D列中的记录b。我已经能够使用案例陈述来实现这一点。
但是,当A列中有重复记录时,我只想要一个基于B列的记录。只有那个记录应该被拉到B列中的值为'y',而F列中包含如果A列中没有任何重复记录在B列中具有值'n',则在输出表中将列D作为列F拉出任何记录。我无法弄清楚这一部分。
如果有任何不清楚的地方,请告诉我。
我正在使用的代码:
SELECT A,B,C,
CASE
WHEN (SELECT COUNT(*) FROM MyTable t2 WHERE t1.A=t2.A)>1
THEN (SELECT TOP 1 CASE WHEN b='y' THEN E ELSE D END
FROM MyTable t3
WHERE t3.A=t1.A
ORDER BY CASE WHEN b='y' THEN 0 ELSE 1 END)
ELSE {
case when cast(C as float) >= 5.00 then (Case when E = '0.00' then D else E end)
when cast(C as float)< 5.00 then D end )
}
END AS F
FROM MyTable t1
答案 0 :(得分:1)
您可能希望将此逻辑封装在Function中以使其看起来更干净,但逻辑将如下所示:
如果表中具有与当前行相同的A
值的行的记录计数大于1,那么选择具有A
ORDER BY {{的值的TOP 1记录1}}
使用其他CASE WHEN b='y' THEN 0 ELSE 1 END
来确定您是否将列CASE WHEN b='y'
或E
用于输出列D
。
和ELSE(记录数不大于1),使用现有的CASE表达式。
编辑:这是一个更伪的代码解释:
F