2014-10-13 4 views
0

Есть ли лучший способ приблизиться к этому SQLSQL Alternative

Иногда у меня доход = 0 в некоторых случаях, мне нужен ежемесячный доход, деленный на ненулевом доходе в конкретном месяце

SELECT "CLASS", 
     "SCHOOL", 
     "Year", 
     "MONTH", 
     Sum("JanIncome")/Sum(
     CASE 
        WHEN "JanIncome">0 THEN 1 
        ELSE NULL 
     END) AS "JanAvg" 
     Sum("FebIncome")/Sum(
     CASE 
        WHEN "FebIncome">0 THEN 1 
        ELSE NULL 
     END) AS "FebAvg" 
FROM  (
       SELECT * 
       FROM school) 
GROUP BY "CLASS", 
     "SCHOOL", 
     "Year", 
     "MONTH"; 
+1

'от (выберите * из школы)' может быть просто 'из школы' –

+0

Вы хотите использовать все дни месяца, например. 31 января или только среднее значение ненулевых значений? –

+0

Только среднее значение ненулевых значений – Ram

ответ

2

Как насчет обнуление вне 0 с и с помощью встроенного в AVG:

SELECT "CLASS","SCHOOL","Year","MONTH", 
    AVG(NULLIF("JanIncome",0)) AS "JanAvg", 
    AVG(NULLIF("FebIncome",0)) as "FebAvg" 

AVG игнорирует аннулирует.

+0

Дамьен, просто у меня есть следующий вопрос. У меня есть 3 записи со значениями 7, 0, 2 --- в этом случае AVG (NULLIF («JanIncome», 0)) AS «JanAvg» , результат 9/2 = 4,5 или 9/3 = 3 .. – Ram

+0

@Ram - 4.5. Если вы не испытываете такого рода вещи, стоит настроить сервер базы данных на вашем компьютере и ознакомиться с временными таблицами или табличными переменными (или с помощью [sql fiddle] (http://sqlfiddle.com)) - в время, необходимое для получения ответов на эти типы вопросов, вы можете попробовать все для себя и посмотреть, как это работает. –