Почему приведение AVG (intger_column) к DECIMAL возвращает минимум шесть десятичных знаков? - PullRequest
6 голосов
/ 15 октября 2010

Рассмотрим этот запрос:

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 ]

9 голосов
/ 15 октября 2010

AVG десятичного всегда возвращает тип данных «десятичное (38, с), разделенное на десятичное (10, 0)» ( см. Здесь )

Вы должны привести результат AVGс желаемой точностью.

2 голосов
/ 15 октября 2010

Я собирался опубликовать что-то похожее на ответ Джаппи вместе с этим примером, чтобы проиллюстрировать, что происходит за кулисами.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...