为什么Sum不能在mysql中使用多个case?

时间:2014-02-21 08:29:12

标签: mysql sum

我有以下mysql查询来计算学生的分数总和。查询成功执行但在Scoring字段下输出NULL。

Select regd, Subject, Section, Test_date,
SUM(t_scored+w_scored+f_scored+cce_scored) as Scoring
from
(SELECT regd, Subject, Section, Test_date,
SUM(CASE WHEN Name_of_exam IN ('First Unit Exam', 'Second Unit Exam', 'Third Unit Exam')
THEN Mark_score
END)/SUM(CASE WHEN Name_of_exam IN ('First Unit Exam', 'Second Unit Exam', 'Third Unit Exam')
THEN Full_Mark
END)*25 AS t_scored,

SUM(CASE WHEN Name_of_exam IN ('First Unit Exam', 'Second Unit Exam' 'Third Unit Exam')
THEN (Full_mark)
END) AS t_fm,

SUM(CASE WHEN Name_of_exam IN ('First Term Weekly Test', 'Second Term Weekly Test', 'Third Term Weekly Test', 'Final Term Weekly Test')
THEN Mark_score
END)/SUM(CASE WHEN Name_of_exam IN ('First Term Weekly Test', 'Second Term Weekly Test', 'Third Term Weekly Test', 'Final Term Weekly Test')
THEN Full_Mark
END)*25 AS w_scored,

SUM(CASE WHEN Name_of_exam IN ('First Term Weekly Test', 'Second Term Weekly Test', 'Third Term Weekly Test', 'Final Term Weekly Test')
THEN (Full_mark)
END) AS w_fm,

SUM(CASE WHEN Name_of_exam = 'Final Unit Exam'
THEN Mark_score
END)/SUM(CASE WHEN Name_of_exam = 'Final Unit Exam'
THEN Full_Mark
END)*25 AS f_scored,

SUM(CASE WHEN Name_of_exam = 'Final Unit Exam'
THEN (Mark_score)
END) AS score_m,

SUM(CASE WHEN Name_of_exam = 'CCE'
THEN Mark_score
END)/SUM(CASE WHEN Name_of_exam = 'CCE'
THEN Full_Mark
END)*25 AS cce_scored,

SUM(CASE WHEN Name_of_exam = 'CCE'
THEN (Full_mark)
END) AS cce_fm
FROM kg2_exam 
WHERE regd='2275' AND Subject not in ('Music','Handwriting','Colouring'))t
group by Subject

从我的代码中可以看出,我想总结t_scored + w_scored + f_scored + cce_scored。但是这里的代码只输出NULL,而某些Mark_score和Full_Mark字段中有值。非常感谢任何帮助和建议。

1 个答案:

答案 0 :(得分:0)

你可以试试这个

SUM(IF(Name_of_exam = 'Final Unit Exam',Mark_score,0))

如果您确定,子查询返回有效结果且无需更改,您可以尝试更改此

SUM(t_scored+w_scored+f_scored+cce_scored)

到这个

SUM(IF(t_scored IS NULL, 0,t_scored)+IF(w_scored IS NULL, 0,w_scored)+IF(f_scored IS NULL, 0,f_scored)+IF(cce_scored IS NULL, 0,cce_scored))

某处必须为NULL,因此45 + NULL将为NULL