Как рассчитать среднее по нескольким столбцам и исключить нули на sql сервере - PullRequest
0 голосов
/ 18 марта 2020

В настоящее время я работаю над запросом sql, в котором мне нужно вычислить среднее значение по нескольким полям, но исключить нули.

Например, у меня есть схема таблицы согласно следующему запросу:

select jan, feb, march, april,
may, june, averageIncome from  userIncome

Я хочу рассчитать среднее значение только для тех значений, которые не равны нулю и имеют выходные данные, как показано ниже:

enter image description here

Возможно ли это в sql server?

Для первой строки она разделится на 6, потому что нет значений 0, а для второй она разделит сумму всех на 5, исключая feb, равное 0.

Ответы [ 2 ]

2 голосов
/ 18 марта 2020

Вы можете сделать:

select jan, feb, march, april, may, june,
  (jan + feb + march + april + may + june) /
  (
    case when jan = 0 then 0 else 1 end +
    case when feb = 0 then 0 else 1 end +
    case when march = 0 then 0 else 1 end +
    case when april = 0 then 0 else 1 end +
    case when may = 0 then 0 else 1 end +
    case when june = 0 then 0 else 1 end
  ) as averageincome
from userincome
0 голосов
/ 18 марта 2020

В самых последних версиях MySQL оператор VALUES удобен для разворачивания строки в подзапросе:

select
    t.*,
    (
        select avg(nullif(val, 0))
        from (values row(jan), row(feb), row(march), row(may), row(june)) t(val)
    ) average_income    
from mytable t

В противном случае вы можете рассмотреть подход union all:

select
    t.*,
    (
        select avg(nullif(val, 0))
        from (
            select jan  val union all select feb union all select march 
            union all select april union all select may union all select june
        ) t
    ) average_income    
from mytable t

Наконец - если вы собираетесь выполнять вычисления вручную: в MySQL один из вариантов укоротить код - это оценить условия в числовом c контексте, например:

select
    t.*,
    (jan + feb + march + april + may + june) / (
        (jan <> 0) + (feb <> 0) + (march <> 0) + (april <> 0) + (may <> 0) + (june <> 0)
    ) average_income
from mytable t
...