根据行在SQL Server表中的组中的值来获取行

时间:2018-10-03 20:27:38

标签: sql sql-server

id      dept         Person       Rating
-------------------------------------------
1       ece            p1           R1  
2       ece            p2           t1
3       eee            P3           R2             
4       eee            p4           M
5       Civil          P5           R2
6       Civil          P6           t2
7       Civil          P7           t2
8       Mech           p8           R2
9       Mech           P9           Null
10      IT             P10          R2J
11      IT             P11          T2
12      IT             P12          T2

我想获取所有在dept中的评级为null或在dept中的评级为M或“ t”评级与在dept中的“ P”评级不同的dept行。

所需的输出:

3       eee            P3           R2             
4       eee            p4           M
8       Mech           p8           R2
9       Mech           P9           Null
10      IT             P10          R2J
11      IT             P11          T2
12      IT             P12          T2

注1::“ t”等级与部门中的“ R”等级不同,这意味着如果某部门中的人员等级为R2,则其他部门中的人员等级为T1。 示例部门。

注2::“ t”等级与部门中的“ R”等级相同,这意味着如果某个部门中的人员等级为R1,则其他部门中的人员等级为T1。 示例部门 ECE

谢谢。

4 个答案:

答案 0 :(得分:0)

如果我没错,您可以在另一个EXISTS中使用EXISTS

SELECT *
       FROM elbat t1
       WHERE EXISTS (SELECT *
                            FROM elbat t2
                            WHERE t2.dept = t1.dept
                                  AND (t2.rating IS NULL
                                        OR t2.rating = 'M'
                                         OR t2.rating LIKE 'T%'
                                            AND EXISTS (SELECT *
                                                               FROM elbat t3
                                                               WHERE t3.dept = t2.dept
                                                                     AND t3.rating LIKE 'R%'
                                                                     AND right(t2.rating, len(t2.rating) - 1) <> right(t3.rating, len(t3.rating) - 1))));

答案 1 :(得分:0)

(从您的另一个问题中,我怀疑您是否理解答复,反正我希望您至少尝试一下)

Select * from myTable t1
where exists (
select * from myTable t2 
where t1.dept = t2.dept AND
  (t2.rating = 'M' or 
   t2.rating is null or 
   right(t1.Rating,1) <> right(t2.Rating,1))
);

DBFiddle Demo

答案 2 :(得分:0)

您可以使用联合,然后对部门进行自联接以获取结果

 SELECT id, dept, Person, Rating FROM Test 
 WHERE Rating IS NULL OR Rating = 'M'
 UNION
 SELECT t1.id, t1.dept, t1.Person, t1.Rating 
 FROM Test t1 
 INNER JOIN Test t2 ON
 t1.dept = t2.dept 
 WHERE
 RIGHT(ISNULL(t1.Rating,0),1) <> RIGHT(ISNULL(t2.Rating,0),1)

这里是demo

答案 3 :(得分:0)

如果我做对了,要返回记录,评分必须为MNULL,或者必须以RT开头。评分的开头字母RT被视为相等,并且如果满足该条件,则该部门中至少有一个其他人必须具有不同的评分(不是以{{ 1}}或R或具有不同的RT评级)。如果正确,则以下查询将返回所需结果:

T