如何使用案例制作评分系统?

时间:2014-12-08 15:51:44

标签: postgresql

非常确定这是一个非常简单的问题:

我需要为学生创建一个考试成绩表,但是需要满足以下条件:如果学生被授予70%或更高的成绩,那么结果将被显示为' Distinction&#39 ;,至少50%但不到70%的等级将被显示为' Pass'低于50%的成绩将显示为“失败”。如果学生没有参加考试,那么结果将显示为“未参加”。

我的代码出现问题似乎无法解决问题:

CREATE VIEW results_table
AS SELECT entry.excode, sname, student.sno, entry.egrade, result AS entry 
FROM student
JOIN entry
ON student.sno = entry.sno
GROUP BY entry.excode,  sname, student.sno, entry.egrade, result

SELECT result
    CASE result
        WHEN entry.egrade >= 70 THEN 'Distinction'
        WHEN entry.egrade >= 50 THEN 'Pass'
        WHEN entry.egrade < 50 THEN 'Fail'
        WHEN entry.egrade = NULL THEN 'Not Taken'

    END;


ORDER BY entry.excode,sname
有人可以告诉我哪里出错了?

1 个答案:

答案 0 :(得分:0)

有两种类型的SQL CASE语句,as documented for PostgreSQL here

  • CASE WHEN condition THEN result ELSE default END
  • CASE expression WHEN value THEN result ELSE default END

第一个表单测试一系列(不相关的)条件,并返回第一个为true的结果,如果没有则为ELSE。第二种形式是针对单个值测试多个条件的简称; CASE x WHEN y THEN 'y' WHEN z THEN 'z' ENDCASE WHEN x = y THEN 'y' WHEN x = z THEN 'z' END的缩写。

在你的代码中,你混淆了这两种语法;你不能使用简写因为你在条件中做了比=更复杂的事情,所以你需要省略result这个词:

CASE
    WHEN entry.egrade >= 70 THEN 'Distinction'
    WHEN entry.egrade >= 50 THEN 'Pass'
    WHEN entry.egrade < 50 THEN 'Fail'
    WHEN entry.egrade IS NULL THEN 'Not Taken'
END

注意:我也将= NULL更改为IS NULL,因为没有任何值&#34;等于&#34; {{1} },因为它意味着&#34;我们不知道价值等于&#34;。)

然后,您需要将其放入NULL查询中,并选择正常列。

从这个简单的查询开始...

SELECT

...你可以像这样把SELECT entry.egrade as result FROM entry; 语句写成:

CASE