Доброго всем времени. Разбираясь с разницей в точности значений для SUM и AVG наткнулся на веселую штуку в BOL.
AVG (Transact-SQL) Результат выражения | Тип возвращаемого значения
категория decimal (p, s) | decimal(38, s), деленное на decimal(10, 0)
Ок. Вроде все понятно. Однако...
Точность, масштаб и длина (Transact-SQL) Операция | Точность результата | Масштаб результата *
e1 / e2 | p1 - s1 + s2 + max(6, s1 + p2 + 1) | max(6, s1 + p2 + 1)
* Точность и масштаб результата имеют абсолютный максимум, равный 38. Если значение точности превышает 38, то соответствующее значение масштаба уменьшается, чтобы по возможности предотвратить усечение целой части результата.
Учитывая, что все кроме s1 у нас константы (p1 = 38, p2 = 10, s2 = 0) и тот факт, что s1 + p2 + 1 всегда больше 6, получаем точность AVG для любого decimal (p, s) 38+11=49 и масштаб s + 11. Используя уточнение в сноске (*) имеем, что AVG по decimal (p, s) будет иметь тип decimal (38, s). Однако это не соответствует действительности для s < 6. В этом случае он = 6.
Да и вообще зачем такая формулировка "Тип возвращаемого значения decimal(38, s), деленное на decimal(10, 0)"?
Может я где-то не прав или что-то пропустил?