当函数中涉及非数字值时,sql返回空字符串?

时间:2012-04-09 04:59:06

标签: mysql sql function aggregate

我的SELECT

中有一个简单的通用加权平均值计算
SELECT ROUND(SUM((G.UnitsAcademic*GD.Grade))/SUM(G.UnitsAcademic),3) AS 'GWA'
FROM Gradesheet G 
INNER JOIN GradeSheetDetail AS GD 
    ON GD.GradesheetId=G.GradesheetId

但是,有些学生有非数字成绩(例如“无考试”)或空白成绩。上面的代码仍然计算并返回一个值。

我希望在计算中涉及非数字值时返回空白(“”)。有没有办法让SQL做到这一点?

2 个答案:

答案 0 :(得分:3)

首先:它是一个概念上不好的想法,要在VARCHAR字段中对数字进行求和(或以任何方式进行数学处理)。最好将它们存储到数字字段(并且对于不适用的情况具有不同的字段)。 (实际上我很惊讶MySQL让你甚至可以在VARCHAR上使用SUM)

但我认为你无法改变它,所以试试这个:

select CASE WHEN SUM(GD.Grade) > 0
            THEN ' ' 
            ELSE SELECT ROUND(SUM((G.UnitsAcademic*GD.Grade))/SUM(G.UnitsAcademic),3) 
            END AS 'GWA' 
            FROM Gradesheet G 
            INNER JOIN GradeSheetDetail AS GD 
                  ON GD.GradesheetId=G.GradesheetId

答案 1 :(得分:2)

试试这个:

SELECT 
    CASE 
        WHEN 
            MAX(CASE WHEN GD.Grade = 'No Grade' OR GD.Grade = ' ' THEN 1 ELSE 0 END) = 1 THEN ' '
        ELSE 
            ROUND(SUM((G.UnitsAcademic*GD.Grade))/SUM(G.UnitsAcademic),3)  
    END AS 'GWA'  
FROM Gradesheet G  
INNER JOIN GradeSheetDetail AS GD  
      ON GD.GradesheetId = G.GradesheetId 

首先,你需要检查是否至少有一个非数字字段,如果'是'则返回空白,否则计算聚合。