2012-04-09 53 views
1

我有一個簡單的一般在我SELECT加權平均計算:當函數中涉及非數值時,sql返回空字符串?

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來做到這一點?

+0

你正在使用什麼RDMS(MySQL,Postgres,Oracle ...)? – 2012-04-09 05:01:44

+0

對不起,我忘了提及,MySQL 5.5 – 2012-04-09 05:03:50

+0

所以,你有一個字符字段,你正在做'SUM'? – 2012-04-09 05:04:30

回答

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 

首先,您需要檢查是否至少有一個非數字字段,如果'是'則返回空白,否則計算聚合。

+0

。爲什麼使用1/0開關呢?何時可以直接包含OR。 – 2012-04-09 05:27:30

+0

只有當我確定沒有非數字字符串時,我需要做出決定計算聚合或否。而且只能按照我的建議。 – 2012-04-09 05:42:04

+0

啊!我懂了!爲此+1。 – 2012-04-09 05:44:03

3

所以第一個:它在概念上是一個BAD IDEA,其數字應該在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 
+0

謝謝。我有約束,我不能編輯列。我實際上期待它返回一個錯誤,這將使我的生活更輕鬆嘿(我得到的結果是所有數字的記錄,當涉及非數字時出錯,然後我就抓住它)。但不,該功能起作用。 – 2012-04-09 05:21:39

+0

有沒有像「GD.Grade IS NOT NUMERIC」那樣的東西? – 2012-04-09 05:26:35

+0

不,但你可以使用總和(我將在一秒內編輯答案,必須自己查看它) – 2012-04-09 05:28:08