2010-10-15 7 views
6

considerar esta consulta:¿Por qué la conversión de AVG (columna de intger) como DECIMAL devuelve un mínimo de seis lugares decimales?

WITH Scores (score) 
    AS 
    (
     SELECT CAST(score AS INTEGER) 
     FROM (
       VALUES (0), 
        (10), 
        (10) 
      ) AS Scores (score) 
    ) 
SELECT AVG(CAST(score AS DECIMAL(19, 8))) AS precision_eight, 
     AVG(CAST(score AS DECIMAL(19, 7))) AS precision_seven, 
     AVG(CAST(score AS DECIMAL(19, 6))) AS precision_six, 
     AVG(CAST(score AS DECIMAL(19, 5))) AS precision_five, 
     AVG(CAST(score AS DECIMAL(19, 4))) AS precision_four 
    FROM Scores; 

Resultados:

precision_eight | precision_seven | precision_six | precision_five | precision_four 
    6.66666666 |  6.6666666 |  6.666666 |  6.666666 |  6.666666 

¿Por qué siempre obtener un mínimo de seis cifras decimales? ¿Este comportamiento documentado?

(estoy que ejecuta SQL Server 2008)

Respuesta

8

AVG de decimal siempre devuelve un "decimal (38, s) dividido por decimal (10, 0)" tipo de datos (see here)

Tienes para convertir el resultado de AVG a la precisión deseada.

2

Estaba a punto de publicar algo similar a Jappie's answer junto con este ejemplo para ilustrar lo que está sucediendo detrás de las escenas.

declare @a int 
set @a = 0 
declare @b int 
set @b = 10 
declare @c int 
set @c = 10 

declare @n decimal(10,0) 
set @n = 3 

select cast((@[email protected][email protected]) as decimal(38,4))/@n 
Cuestiones relacionadas