2012-01-17 5 views
19

Sto lavorando su un sito che richiede di visualizzare un grafico del numero medio giornaliero di un input dell'utente. Ho una query SQL che restituisce già queste informazioni a me:Selezione/trasmissione dell'output come numero intero in SQL

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

Questo mi dà il risultato che sto cercando, ma il risultato è dato con tre decimali di precisione. Voglio arrotondare questo numero. Potrei farlo in PHP o nel mio motore di template, ovviamente, ma ero curioso di sapere se c'era un modo per fare tutto questo nel database.

C'è un modo per trasmettere un output come numero intero (in MySQL)?

+3

Per curiosità, nessuna ragione per cui non si sta utilizzando [funzione AVG] (http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_avg)? –

+0

@jimmy_keen non aveva idea dell'esistenza! C'è un motivo per usarlo? (meglio, più veloce, più forte?) – MrGlass

+1

@MrGlass - Più conciso ed evita possibili divisioni per problemi zero in altri RDBMS (AFAIK MySQL restituisce 'NULL' su una divisione per zero comunque) –

risposta

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

-1. Se si utilizza "INT" come tipo si otterrà un errore. I tipi disponibili per CAST/CONVERT possono essere visti nella documentazione http://dev.mysql.com/doc/refman/5.0/en/cast-functions.html#function_convert – Corneliu

+1

Questo è importante? L'approccio sta rispondendo al Q. –

+0

@Corneliu ho provato "INT" senza errori. – 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

come circa usando MySQL FORMAT funzione?

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

funziona per me. –

17

I tipi validi per un CAST in MySQL sono i seguenti

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

Così si potrebbe utilizzare

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

O SIGNED se la parte SUM può sempre aggiungere fino a un numero negativo.

4

Utilizzare DIV operator.

mysql> SELECT 5 DIV 2; 
    -> 2 

Divisione intera. Simile a FLOOR(), ma è sicuro con i valori BIGINT. Potrebbero verificarsi risultati errati per operandi non grandissimi che superano la gamma BIGINT.