我似乎无法让CASE
部分工作
SELECT ROUND((SUM((to_number(g.grade, '9D99') * s.subjunits)))/(SUM(s.subjunits)), 2), CASE WHEN g.grade='DRP' THEN '5.00' END
FROM (grade g
INNER JOIN registration r ON r.grade_id = g.grade_id)
INNER JOIN subject s ON s.subjcode = r.subjcode
WHERE g.grade NOT IN ('INC', 'W', 'INP')
AND r.sy = right(to_char(extract(year from now()- interval '1 year'),'9999'), 4)||'-'||right(to_char(extract(year from now()), '9999'),4)
AND r.sem IN ('1', '2')
AND r.studid='2012-0004'
GROUP BY g.grade;
我真正想做的就是,如果学生有DRP等级,它将自动计为5.0,以便数据库可以包括DRP来计算GPA。
但它只是说
ERROR: invalid input syntax for type numeric: " "
********** Error **********
ERROR: invalid input syntax for type numeric: " "
SQL state: 22P02
目前正在使用postgresql 9.3.2
答案 0 :(得分:0)
CASE
部分没问题(虽然你错过了ELSE
,它应该仍然有效,并且可选择返回NULL)。
错误是由TO_NUMBER()
函数引起的。
答案 1 :(得分:0)
case语句返回一个值,该值与您输入的任何值本身没有任何关系。您似乎认为您的case语句将更新g.grade的值。它没有赢。我想你想要做的是在第一个函数中使用case语句代替g.grade的值。也许:
SELECT ROUND((SUM((to_number((case when g.grade='DRP' then '5.00' else g.grade end), '9D99') * s.subjunits)))/(SUM(s.subjunits)), 2)
我没有Postgres的副本,所以我无法对此进行测试,而且我不熟悉to_number功能(自从我使用Postgres以来已经过去了好几年) 。但这不是你问题的重点,所以如果这不是正确的方式来拨打号码,那就是另一个问题。