2012-06-19 42 views
14

In una delle mie domande, sembra che la funzione AVG restituisca un valore int.SQL AVG che restituisce un numero

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

Come ottengo per restituire i valori in virgola mobile? Ho provato a lanciarlo ma tutte le mie righe per avg_level erano ancora numeri interi.

+1

Il comportamento della funzione AVG() su numeri interi non è definito nello standard ANSI. Alcuni database restituiscono un intero; altri database restituiscono un float. Per ottenere un float puoi usare un cast/conversione esplicito. Oppure, quello che faccio è semplicemente moltiplicare per 1.0. –

risposta

26

provare a farlo in questo modo:

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

Inoltre ho trovato this argomento dove si possono trovare un po 'di un altro approccio, ma non utilizzato la sua e non sanno esattamente se funziona o meno.

+3

@CodeKingPlusPlus - Suppongo che tu abbia provato 'CAST (AVG (field) AS FLOAT)'? 'AVG (field)' restituirà sempre la stessa risposta, che è un INT, e in questo caso il casting di un FLOAT non ti aiuterà. 'AVG (CAST (field AS FLOAT))', tuttavia, è molto diverso e probabilmente quello che vuoi. * [+ 1 a questa risposta] * – MatBailie

+0

@Dems sì, hai ragione, sembra uguale ma non lo è. – Sajmon

1

La trasmissione è più certa, ma lo è anche lo ...AVG(1.0 * e.employee_level)... e può essere più leggibile.

+3

Dipende dall'RDBMS. AFAIK molti RDBMS considerano '1.0' come un valore NUMERICO a virgola fissa, non un FLOAT. Effetto simile, forse anche migliore per questo caso, ma non proprio lo stesso. Per questo motivo tendo a preferire CAST/CONVERT esplicito nel mio codice. Quindi * conosci * quali tipi di dati sono le cose, piuttosto che fare affidamento sulla precisione dei dati e sulle conversioni implicite. – MatBailie

Problemi correlati