我有下表
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
答案 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