如何获得所有科目大于等于80的学生的姓名?

时间:2017-10-30 07:39:11

标签: sql-server oracle

我有下表

Name  |  Subject  | Marks
 --------------------------
 a        M          70
 a        S          80  
 a        L          90
 a        G          100 
 b        M          80
 b        S          90  
 b        L          95
 b        G          100
 c        M          90
 c        G          100 

在这里,我有一个“学生”表,我希望获得学生姓名大于等于“80”的学生姓名,如下表所示。

 Name 
 b
 c

6 个答案:

答案 0 :(得分:2)

一个简单的聚合。

select   name
from     my_table
group by name
having   min(marks) >= 80

在“现实世界”中,你可能会有一个单独的学生表,每个学生一行,这可能会改变逻辑。最佳实施可能取决于每位学生的分数表中的平均行数。

答案 1 :(得分:2)

您必须使用GROUP BY子句,如下所示。这是一个帮助您理解GROUP BY和HAVING子句的经典问题。 GROUP BY实现聚合,而HAVING允许你在其上设置条件。

SELECT name
FROM student
GROUP BY name
HAVING MIN(mark) >= 80

答案 2 :(得分:0)

使用CASE表达式检查每行大于或等于80。

<强>查询

select t.Name from(
    select Name, Subject, Marks,
    case when Marks > 79 then 1 else 0 end as mark_status
    from your_table_name
) t
group by t.Name
having count(t.Marks) = sum(t.mark_status);

答案 3 :(得分:0)

选择名称 从表 其中名称不在(选择不同的名称,其中标记&lt; 80);

答案 4 :(得分:0)

从学生ss中选择不同的ss.name

在s.name = ss.name

上加入(从学生组中选择姓名,计数(*)q)

加入(选择名称,计数(*)q,来自学生,其中标记&gt; = 80按名称分组)s1 on s1.name = ss.name

其中s.q = s1.q

答案 5 :(得分:0)

这应该有用。

DECLARE  @Restult TABLE ([Name] VARCHAR(100), [Subject] VARCHAR(100), Marks INT)

INSERT INTO @Restult

 select 'a','M',  70
 union
 select 'a','S',  80
 union  
 select 'a','L',  90
 union
 select 'a','G',  100
 union 
 select 'b','M',  80
 union
 select 'b','S',  90
 union  
 select 'b','L',  95
 union
 select 'b','G',  100
 union
 select 'c','M',  90
 union
 select 'c','G',  100 


;WITH CTE AS
     (
         SELECT [NAME],
                SUM(IIF(r.Marks <80,1, NULL)) AS IsEightyExists             
         FROM   @Restult r
         GROUP BY r.[Name]
     )     



SELECT [Name]
FROM   CTE c
WHERE  IsEightyExists IS NULL