2012-08-17 35 views
1

所有记录中的考试成绩表返回记录,其中1个== PASS和0 == FAIL所有比赛并且其中至少一个不匹配


ID Name Test Result 
-------------------- 
1  John MATH 1 
2  John ENGL 1 
3  Mary MATH 1 
4  Mary PSYC 0 

编辑:假设名字是唯一的。

我需要获得所有记录谁

1)通过了所有测试
2)失败的人至少有一个测试

所以,第一个查询应返回约翰和他的所有记录,以及第二个查询应该返回Mary和她的所有记录(包括具有PASS的记录)。

我试图做一个LEFT OUTER JOIN本身和比较计数,但似乎没有得到一个工作查询。


SELECT * FROM Results R1 
LEFT OUTER JOIN Results R2 on R1.ID=R2.ID and R2.Result=1 
WHERE ??? count of rows from R1 is compared to count of non-null rows from R2 

回答

3

这是一个 “海报孩子” 演习为EXISTS条款:

在leasr一个失败的结果:

select * from Results r 
where exists (select * from Results rr where rr.Name=r.Name AND Result=0) 

一切都过去了:

select * from Results r 
where not exists (select * from Results rr where rr.Name=r.Name AND Result=0) 

看到这些查询的工作在你的数据集at sqlfiddle.com上。

+0

这对于通过所有测试的情况无效,因为玛丽会在两个查询中返回 – 2012-08-17 18:06:37

+0

@JustinPihony不,因为'EXISTS'前面的'NOT',她不会被包括在“全部通过”结果中。请参阅[sqlfiddle](http://sqlfiddle.com/#!3/2a4​​c4/5)的链接。 – dasblinkenlight 2012-08-17 18:14:22

+0

当你的名字加入时你是对的,但是改变它以脱离ID是错误的。 http://sqlfiddle.com/#!3/d8b08/2 – 2012-08-17 18:16:34

1

一种方式

Select Name, 
    Case failCount When 0 then 'X' Else '' End PassedAll, 
    Case failCount When 0 then '' Else 'X' End FailedOneOrMore 
    From (Select name, 
     Sum(Case Result when 0 Then 1 Else 0 End) failCount 
     From Results R 
     Group By Name) Z 

把所有的记录,刚刚加入这个

Select zz.Name, zz.PassedAll, zz.FailedOneOrMore, 
     r.Test, r.Result 
    From (Select Name, 
      Case failCount When 0 then 'X' Else '' End PassedAll, 
      Case failCount When 0 then '' Else 'X' End FailedOneOrMore 
     From (Select name, 
       Sum(Case Result when 0 Then 1 Else 0 End) failCount 
       From Results R 
       Group By Name) Z) ZZ 
     Left Join Results r On r.Name = zz.Name 
+0

这是一个不错的选择,但它仅返回一个或多个结果失败 – kateroh 2012-08-17 18:23:28

+0

ahhh是,编辑为正确 – 2012-08-17 18:37:09

2

一切都过去了

SELECT Name FROM Results R1 
GROUP BY NAME 
HAVING SUM(RESULT) = COUNT(RESULT) 

一些失败

SELECT Name FROM Results R1 
GROUP BY NAME 
HAVING SUM(RESULT) < COUNT(RESULT) 

希望它可以帮助

编辑

一切都过去了

SELECT Name FROM Results R1 
GROUP BY NAME 
HAVING SUM(1-RESULT) = 0 

一些失败

SELECT Name FROM Results R1 
GROUP BY NAME 
HAVING SUM(1-RESULT) > 0 

(这可能运行得更快)

+0

作为说明,您应该不使用名称,而是使用一些唯一的标识符。 – 2012-08-17 18:07:41

+0

简单而优雅,谢谢! – kateroh 2012-08-17 18:10:04

+0

有两个问题:我需要说这只会在结果列中只有0和1的情况下才起作用吗?......说我为我的答案感到自豪吗? (jk) – saul672 2012-08-17 18:11:27

0

此查询使用子查询返回所有记录(通过&失败)对谁已通过测试的至少一个人:

select * from Results where Name in (select Name from Results where Result = '1' group by Name);

结果中排除那些谁没有通过任何测试。

相关问题