显示通过主题“ M”但未通过主题“ P”的姓名

时间:2018-10-13 11:58:29

标签: sql sql-server

create table Student
(
  Name varchar(20),
  Subject varchar(20),
  Mark int
)

insert into Student values('A','M',30),
                          ('A','P',45),
                          ('B','M',47),
                          ('B','P',70)

SELECT * FROM Student

上面是表格的代码。考虑通过标记= 35 需要显示通过主题“ P”但未通过主题“ M”的姓名

4 个答案:

答案 0 :(得分:3)

SELECT Name
FROM Student
group by Name
having
min(case when Subject = 'M' then Mark end) < 35
and
min(case when Subject = 'P' then Mark end) >= 35

答案 1 :(得分:1)

根据您所说的内容,您需要通过科目'P'而同时未能通过科目'M'的学生

SELECT Name
FROM Student
WHERE Subject = 'P' AND Mark >= 35
AND Name IN (SELECT Name FROM Student WHERE Subject = 'M' AND Mark < 35);

结果:

+----+------+
|    | Name |
+----+------+
|  1 | A    |
+----+------+

甚至

SELECT *
FROM Student S1
WHERE EXISTS
(
    SELECT 1
    FROM Student S2
    WHERE S1.Name = S2.Name AND 
          ((S1.Mark > 35 AND S2.Mark < 35) OR (S2.Mark > 35 AND S1.Mark < 35))

)

结果:

+----+------+---------+------+
|    | Name | Subject | Mark |
+----+------+---------+------+
|  1 | A    | M       |   30 |
|  2 | A    | P       |   45 |
+----+------+---------+------+

Demo

答案 2 :(得分:1)

您可以使用Exists

select * from Student s where exists(select 1 from Student s1
                                where s1.Name=s.Name
                                group by s1.Name
                                having sum(case when s1.Subject='P' and s1.Mark>=35 then 1 else 0 end)>0
                                 and sum(case when s1.Subject='M' and s1.Mark<35 then 1 else 0 end)>0
                                 ) 

Name    Subject Mark
A        M      30
A        P      45

Demo

答案 3 :(得分:0)

请检查此查询

SELECT Name, M, P  
 FROM  
 (SELECT Name, Subject, Mark   
    FROM Student) AS SourceTable  
PIVOT  
(  
AVG(Mark)  
FOR Subject IN (M, P)  
) AS PivotTable
WHERE M < 35 and P >= 35