>Ho un problema. Devo calcolare la media di un valore in un campo
>che è di tipo INT. La funzione AVG purtroppo mi restituisce un
>risultato di tipo INT e si mangia i decimali che invece a me
>servono. Ora, dovrei cambiare il tipo di campo, ma la cosa mi
>creerebbe un sacco di probolemi.
>
>Esiste un modo per fargli calcolare la media con decimali di
>valori INT?
Certo, è sufficiente castare la colonna in un data type decimale (a lunghezza fissa o variabile) prima di applicare la funzione di aggregazione:
USE tempdb;
CREATE TABLE dbo.foo(
value int NOT NULL
);
INSERT dbo.foo VALUES (1), (2), (3), (4);
SELECT AVG(value) AS Media
FROM dbo.foo;
/* Output:
Media
-----------
2
(1 row(s) affected)
*/
SELECT AVG(CAST(value AS real)) AS Media
FROM dbo.foo;
/* Output:
Media
----------------------
2,5
(1 row(s) affected)
*/
SELECT AVG(value * 1.) AS Media
FROM dbo.foo;
/* Output:
Media
---------------------------------------
2.500000
(1 row(s) affected)
*/
DROP TABLE dbo.foo;
Essendo la colonna value un intero, il risultato della funzione AVG() sarà anch'esso intero (1° esempio).
Nel 2° esempio ho convertito esplicitamente la colonna da intero a real ottenendo come risultato della funzione un valore float.
Infine nel 3°caso ho semplicemente moltiplicato il valore intero per un literal decimal (1.) ottenendo un valore decimal (per via del Data Type Precedence) che aggregato restituisce nuovamente una valore decimal.
>Grazie in anticipo.
Prego.
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/