选择句中的案例

时间:2017-05-29 18:45:37

标签: sql sql-server tsql case

我有一个sql语句的问题,我必须平均5个音符,但只要字段已满,我有字段f1,f2,f3,f4,如果f1和f3已满,我的select必须添加f1和f3并将其除以2,但如果f1,f2和f4已满,则必须加上它并将其除以3,我已尝试CASE但它不起作用,它总是留下一个案例。

这是我的代码:

SELECT b.nombreAlumno As 'Alumno', f1 as 'F1' ,f2 as 'F2',f3 as 'F3',f4 as 'F4',sumativa as 'Sumativa',
'Promedio' =  Case 
when f1 > 0 then @promedio=(f1 + sumativa) / 2 
when f2 > 0 then (f1 + f2 + sumativa) / 3
when f3 > 0 then (f1 + f2 + f3 + sumativa) / 4
when f4 > 0 then (f1 + f2 + f3 + f4 + sumativa) / 5
End

FROM tbNotas a,tbalumnos b
WHERE   idquimestre=@quimestre and idParcial=@parcial and idmateria=@materia and a.idalumno=b.idalumno and a.idparalelo=@paralelo
and a.idcurso=@idcurso

我的数据 f1 10 f2 8.67 f3 10 f4 0 sumativa 1

结果5.5(因为应该添加10 + 8.67 + 10 + 1/4 => 7.4)

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

如果要忽略它们,假设值为0或NULL,则可以执行以下操作:

select ( (coalesce(f1, 0) + coalesce(f2, 0) + coalesce(f3, 0) + coalesce(f4, 0) + coalesce(f5, 0)) * 1.0 /
         ( coalesce(f1 > 0, 0) + coalesce(f2 > 0, 0) + coalesce(f3 > 0, 0) + coalesce(f4 > 0, 0) + coalesce(f5 > 0, 0) )
       ) as average

如果该值仅显示0而非NULL,则不需要coalesce()

编辑:

以上是针对MySQL的。更通用的解决方案是:

select ( ((case when f1 > 0 then f1 else 0 end) +
          (case when f2 > 0 then f2 else 0 end) +
          (case when f3 > 0 then f3 else 0 end) +
          (case when f4 > 0 then f4 else 0 end) +
          (case when f5 > 0 then f5 else 0 end)
         ) /
         nullif( (case when f1 > 0 then 1.0 else 0 end) +
                 (case when f2 > 0 then 1 else 0 end) +
                 (case when f3 > 0 then 1 else 0 end) +
                 (case when f4 > 0 then 1 else 0 end) +
                 (case when f5 > 0 then 1 else 0 end), 0
               )
         )