2012-07-24 103 views
1

基本上,我有一个表格结构,学生可以参加考试。选择其中一个ID不在另一个表中

结构是这样的:

http://www.dropmocks.com/mBj9YX

SELECT s.name AS studentName, 
t.name AS testName, 
MAX(sc.percentile) 
AS percentile, 
    (CASE WHEN MAX(sc.percentile) > 70 THEN 'passed' 
    WHEN MAX(sc.percentile) <70 THEN 'fail' 
    WHEN MAX(sc.percentile) IS NULL THEN 'not taken' END) AS status 
FROM Score sc 

并不想得到我想要的部分是在这里:

WHEN MAX(sc.percentile) IS NULL THEN 'not taken' END 

如果学生不参加考试时,测试ID将不在分数表中。如果他们没有参加测试,我无法弄清楚会在状态栏中添加“未采用”的查询。帮帮我?前两项工作,但如果测试表中存在测试ID并且学生未参加该测试,则该学生的测试ID将不会显示在评分表中。我试图找到一种方法来检测。

+0

你真的想要什么? – evilone 2012-07-24 17:46:54

+0

一种检测学生未采取的测试的方法。 – user1319343 2012-07-24 17:48:42

+3

然后你不直接从表中选择分数。相反,做一些类似于从学生S加入测试T ...左加入SCORE SC ... WHERE SC.PrimaryKey IS NULL(或者,在您的CASE语句中放置SC.PrimaryKey IS NULL – Set 2012-07-24 17:52:56

回答

0

也许您正在使用IS_MEMBER NULL而不是IS NULL? IS_MEMBER函数与您尝试实现的内容无关(检查某个角色组中是否有人)。这有时会发生,因为当你按空格键入查询时,mssms添加了IS_MEMBER。它发生在我身上。尝试改变

WHEN MAX(sc.percentile) IS_MEMBER NULL THEN 'not taken' 

WHEN MAX(sc.percentile) IS NULL THEN 'not taken' 
+0

对不起,这是一个错字,我的意思是第二个反正。 – user1319343 2012-07-24 18:02:30

0

我从来没有测试,但尝试这样

SELECT 
    sc.name AS studentName, 
    t.name AS testName, 
    MAX(sc.percentile) AS percentile, 
    (CASE 
     WHEN MAX(sc.percentile) > 70 THEN 'passed' 
     WHEN MAX(sc.percentile) < 70 THEN 'fail' 
     WHEN sc.testID IS NULL THEN 'not taken' 
     -- /*OR...*/ WHEN MAX(sc.percentile) IS NULL THEN 'not taken' 
    END) AS status 
FROM Score sc 
FULL OUTER JOIN Test t ON t.testID = sc.testID 
+0

这个工作,需要多测试一下 – user1319343 2012-07-24 18:06:15

+0

不完全正常工作。有三个学生在桌子上,它不会做我做过的事情。 – user1319343 2012-07-24 18:18:58

+0

请给我发送创建脚本和表格的插入脚本。 – FabianoLothor 2012-07-24 20:18:24

0

CASE变种时的空THEN ...永远不会成功。

使用此:

CASE WHEN MAX(sc.percentile)为null,则 '不采取' ELSE '123' END

或者只是这样的:

COALESCE(MAX(sc.percentile ),'未服用')

相关问题