代码之家  ›  专栏  ›  技术社区  ›  onedaywhen

为什么将AVG(intger_column)转换为DECIMAL至少返回六位小数?

  •  6
  • onedaywhen  · 技术社区  · 15 年前

    请考虑以下查询:

    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;
    

    结果:

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

    (我正在运行SQL Server 2008)

    2 回复  |  直到 15 年前
        1
  •  9
  •   Carvellis    15 年前

    decimal的AVG总是返回“decimal(38,s)除以decimal(10,0)”数据类型( see here )

    你必须将平均结果转换为所需的精度。

        2
  •  2
  •   Community Mohan Dere    9 年前

    我正要发布类似于 Jappie's answer

    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((@a+@b+@c) as decimal(38,4))/@n
    
    推荐文章