2012-01-17 11 views
19

Estoy trabajando en un sitio que requiere que muestre un gráfico del número promedio por día de una entrada de usuario. Tengo una consulta SQL ya que devuelve esta información para mí:Seleccionar/emitir salida como un entero en SQL

SELECT sum(number)/count(number) as average, date FROM stats WHERE * GROUP BY date 

Esto me da el resultado que estoy buscando, pero el resultado se da con tres decimales de precisión. Quiero redondear de este número. Podría hacerlo en PHP o en mi motor de plantillas, por supuesto, pero tenía curiosidad de saber si había alguna forma de hacerlo en la base de datos.

¿Hay alguna forma de convertir una salida como un entero (en MySQL)?

+3

Por curiosidad, ¿por qué no está utilizando [la función AVG] (http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_avg)? –

+0

@jimmy_keen no tenía idea de que existía! ¿Hay alguna razón para usarlo? (mejor, más rápido, más fuerte?) – MrGlass

+1

@MrGlass - Más conciso y evita la posibilidad de dividir por cero problemas en otros RDBMS (AFAIK MySQL devuelve 'NULL' en una división por cero de todos modos) –

Respuesta

28
SELECT 
    CAST(sum(number)/count(number) as UNSIGNED) as average, 
    date 
FROM stats 
WHERE * 
GROUP BY date 
+6

-1. Si usa "INT" como tipo, obtendrá un error. Los tipos disponibles para CAST/CONVERT se pueden ver en la documentación http://dev.mysql.com/doc/refman/5.0/en/cast-functions.html#function_convert – Corneliu

+1

¿Eso es importante? El enfoque es responder a la Q. –

+0

@Corneliu probé 'INT' sin error. – alex

1
SELECT convert(int, sum(number)/count(number)) as average, 
    date 
FROM stats 
WHERE * GROUP BY date 

o

SELECT 
    CAST(sum(number)/count(number) as INT) as average, 
    date 
FROM stats 
WHERE * 
GROUP BY date 
5

cómo sobre el uso de MySQL FORMAT Función?

mysql> SELECT FORMAT(12345.123456, 4); 
+-------------------------+ 
| FORMAT(12345.123456, 4) | 
+-------------------------+ 
| 12,345.1235    | 
+-------------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT FORMAT(12345.123456, 0); 
+-------------------------+ 
| FORMAT(12345.123456, 0) | 
+-------------------------+ 
| 12,345     | 
+-------------------------+ 
1 row in set (0.00 sec) 
+0

me funciona. –

17

Los tipos válidos para un CAST en MySQL son los siguientes

  • BINARY[(N)]
  • CHAR[(N)]
  • DATE
  • DATETIME
  • DECIMAL[(M[,D])]
  • SIGNED [INTEGER]
  • TIME
  • UNSIGNED [INTEGER]

lo que podría utilizar

SELECT CAST(sum(number)/count(number) AS UNSIGNED) as average... 

O SIGNED si la parte SUM jamás puede añadir hasta un número negativo.

4

Utilice DIV operator.

mysql> SELECT 5 DIV 2; 
    -> 2 

La división entera. Similar a FLOOR(), pero es seguro con los valores de BIGINT. Pueden ocurrir resultados incorrectos para operandos no enteros que exceden el rango BIGINT.

Cuestiones relacionadas