做过研究,但仍然遇到这个问题
假设我有表
class name score
1 Alex 0
1 Beth 0
1 Chris 100
1 Dan 90
2 Frank 80
2 George 0
2 Henry 0
3 Jill 90
4 Kerry 0
5 Liam 90
5 Matt 80
5 Nick 0
想要在同一个类中找到至少2个名称的行具有非零分数:示例输出
class name score
1 Chris 100
1 Dan 90
5 Liam 90
5 Matt 80
我尝试了一个嵌套查询,首先删除零分,然后计算报告类>的类。 2但我是一个相对初学者,必须缺少一些简单的东西。
答案 0 :(得分:1)
处理此查询的一种标准方法是使用带有条件聚合的子查询来标识哪些类具有2个或更多具有非零分数的学生。然后可以将原始表连接到此表以获取结果集。
SELECT t1.class, t1.name, t1.score
FROM scores t1
INNER JOIN
(
SELECT class,
SUM(CASE WHEN score > 0 THEN 1 ELSE 0 END) AS scoreCount
FROM scores
GROUP BY class
HAVING scoreCount >= 2
) t2
ON t1.class = t2.class
WHERE t1.score > 0
答案 1 :(得分:1)
SELECT DISTINCT x.*
FROM my_table x
JOIN my_table y
ON y.class = x.class
AND y.name <> x.name
AND y.score > 0
WHERE x.score > 0;
答案 2 :(得分:0)
这对你有用:
SELECT *
FROM mytable
WHERE
score > 0 AND
class in (
SELECT class FROM mytable
WHERE score > 0
GROUP BY class
HAVING count(*) > 1) ;
Here is a functional example with your data
所以从内部开始,我们想要计算非零分数的类数:
SELECT class, count(*) FROM mytable WHERE score > 0 group by class;
这表明第1,5类有多个分数&gt;所以我们从SELECT中返回count(*)并在HAVING子句中使用它:
SELECT class FROM mytable WHERE score > 0 group by class having count(*)>1;
这只给我们1,5级
我们现在构建一个查询,以从该子类匹配的子查询中提取:
SELECT *
FROM p
WHERE class in
(SELECT class FROM mytable WHERE score > 0 group by class having count(*)>1);
但是这会返回与我们的子查询匹配的所有类,甚至是得分为0的类!所以我们必须在WHERE子句中再添加一个条件,这会产生上面的初始查询。