2012-06-19 25 views
14

En una de mis preguntas, parece que la función AVG devuelve un int.SQL AVG devolver un int

select ..., AVG(e.employee_level)avg_level 

¿Cómo obtengo que devuelva valores de coma flotante? Intenté lanzarlo pero todas mis filas para avg_level seguían siendo números enteros.

+1

El comportamiento de la función AVG() en números enteros no se define en la norma ANSI. Algunas bases de datos devuelven un entero; otras bases de datos devuelven un flotador. Para obtener un flotador puede usar un lanzamiento/conversión explícito. O lo que hago es simplemente multiplicar por 1.0. –

Respuesta

26

tratar de hacerlo de esta manera:

AVG(Cast(e.employee_level as Float)) as avg_level 

También encontré this tema donde se puede encontrar algún otro enfoque, pero no he usado su y no saben exactamente si funciona o no.

+3

@CodeKingPlusPlus - Supongo que probaste 'CAST (AVG (field) AS FLOAT)' 'AVG (campo)' seguirá devolviendo la misma respuesta, que es un INT, momento en el que lanzarlo a un FLOAT no lo ayudará. 'AVG (CAST (campo AS FLOAT))', sin embargo, es muy diferente, y probablemente sea lo que quieras. * [+ 1 a esta respuesta] * – MatBailie

+0

@Dems sí, tienes razón, parece lo mismo pero no es así. – Sajmon

1

Casting es más seguro, pero ...AVG(1.0 * e.employee_level)... podría hacerlo tan bien, y puede ser más legible.

+3

Depende del RDBMS. AFAIK muchos RDBMS tratan '1.0' como un valor NUMÉRICO de punto fijo, no como un FLOTADOR. Efecto similar, posiblemente incluso mejor para este caso, pero no exactamente lo mismo. Por esta razón, tiendo a preferir explícita CAST/CONVERT en mi código. Entonces * sabes * qué tipos de datos son las cosas, en lugar de depender de la precidencia de tipos de datos y las conversiones implícitas. – MatBailie