从基于其他字段的字段中的多个记录中提取1个记录

时间:2017-06-07 13:00:50

标签: sql join sql-server-2012

 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

1 个答案:

答案 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