Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 AVG. Типы возвращаемых значений.  [new]
PetrovichSK
Guest
Доброго всем времени. Разбираясь с разницей в точности значений для 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)"?
Может я где-то не прав или что-то пропустил?
29 апр 15, 08:35    [17579119]     Ответить | Цитировать Сообщить модератору
 Re: AVG. Типы возвращаемых значений.  [new]
Glory
Member

Откуда:
Сообщений: 104751
PetrovichSK
Да и вообще зачем такая формулировка "Тип возвращаемого значения decimal(38, s), деленное на decimal(10, 0)"?

Наверное потому, что среднее = сумма / количество
29 апр 15, 08:41    [17579126]     Ответить | Цитировать Сообщить модератору
 Re: AVG. Типы возвращаемых значений.  [new]
PetrovichSK
Guest
Glory
PetrovichSK
Да и вообще зачем такая формулировка "Тип возвращаемого значения decimal(38, s), деленное на decimal(10, 0)"?

Наверное потому, что среднее = сумма / количество

Только чтобы показать, что AVG есть результат деления суммы значений на количество отобранных записей? ;)
Да ведь по итогу не дает обещанный тип данных при s<6.
29 апр 15, 08:52    [17579161]     Ответить | Цитировать Сообщить модератору
 Re: AVG. Типы возвращаемых значений.  [new]
Glory
Member

Откуда:
Сообщений: 104751
PetrovichSK
Только чтобы показать, что AVG есть результат деления суммы значений на количество отобранных записей? ;)

Количество(делитель) - это всегда целое цисло

(все) int / (все) int есть (все) int - хоть в функции, хоть не в функции
float/ int есть float - хоть в функции, хоть не в функции
...

А вот с numeric-ами просто описано, что делитель будет decimal(10, 0)
Потому что только для decimal существуют правила для вычисления точности, масштаба и длины результата
29 апр 15, 09:01    [17579182]     Ответить | Цитировать Сообщить модератору
 Re: AVG. Типы возвращаемых значений.  [new]
PetrovichSK
Guest
Glory
Количество(делитель) - это всегда целое цисло

(все) int / (все) int есть (все) int - хоть в функции, хоть не в функции
float/ int есть float - хоть в функции, хоть не в функции
...

А вот с numeric-ами просто описано, что делитель будет decimal(10, 0)
Потому что только для decimal существуют правила для вычисления точности, масштаба и длины результата

Правильно. Однако при типе делителя decimal(10, 0) (фиксированные масштаб и длина) формула сводится к результату decimal(38, s).
Возможно в будущих версиях не напишут decimal(16, 0) и не надо будет переписывать вторую статью.
А вот почему тип не соответствует заявленному при s < 6?

Сообщение было отредактировано: 29 апр 15, 09:32
29 апр 15, 09:17    [17579251]     Ответить | Цитировать Сообщить модератору
 Re: AVG. Типы возвращаемых значений.  [new]
Glory
Member

Откуда:
Сообщений: 104751
PetrovichSK
А вот почему тип не соответствует заявленному при s < 6?

Что ?
29 апр 15, 09:39    [17579374]     Ответить | Цитировать Сообщить модератору
 Re: AVG. Типы возвращаемых значений.  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 659
Вы же сами посчитали
PetrovichSK
получаем точность AVG для любого decimal (p, s) 38+11=49 и масштаб s + 11

Для любого decimal (p, s) получаем точность AVG decimal (49, s+11).
А дальше, согласно той самой сноске, как только p = 49 > 38, сервер старается "спасти" как можно больше значащих цифр в целой части.
Как? Ни где не описано. Ни как не гарантируется.
PetrovichSK
А вот почему тип не соответствует заявленному при s < 6

По этому нет ни какого несоответствия, от s уже ничего не зависет.
29 апр 15, 10:14    [17579626]     Ответить | Цитировать Сообщить модератору
 Re: AVG. Типы возвращаемых значений.  [new]
PetrovichSK
Guest
Glory
Что ?

Точность, масштаб и длина (Transact-SQL)
Операция | Точность результата | Масштаб результата *
e1 / e2 | p1 - s1 + s2 + max(6, s1 + p2 + 1) | max(6, s1 + p2 + 1)
* Точность и масштаб результата имеют абсолютный максимум, равный 38. Если значение точности превышает 38, то соответствующее значение масштаба уменьшается, чтобы по возможности предотвратить усечение целой части результата.

declare @e1 dec(38,4) = 1., @e2 dec(10,0) = 1.
select @e1/@e2

p1 = 38, s1 = 4, p2 = 10, s2 = 0
Точность результата: p1 - s1 + s2 + max(6, s1 + p2 + 1) = 38 - 4 + max(6, 4 +10 + 1) = 49
Масштаб результата: max(6, s1 + p2 + 1) = max(6, 4 + 10 + 1) = 15
* Точность результата: 38. Масштаб результата: 15 - (49 - 38) = 4
результат должен иметь тип decimal(38, 4)
На самом деле decimal(38, 6)
29 апр 15, 10:21    [17579688]     Ответить | Цитировать Сообщить модератору
 Re: AVG. Типы возвращаемых значений.  [new]
Glory
Member

Откуда:
Сообщений: 104751
PetrovichSK
Масштаб результата: 15 - (49 - 38) = 4

Откуда эта формула ?
29 апр 15, 10:26    [17579712]     Ответить | Цитировать Сообщить модератору
 Re: AVG. Типы возвращаемых значений.  [new]
PetrovichSK
Guest
Guf
Вы же сами посчитали
PetrovichSK
получаем точность AVG для любого decimal (p, s) 38+11=49 и масштаб s + 11

Для любого decimal (p, s) получаем точность AVG decimal (49, s+11).
А дальше, согласно той самой сноске, как только p = 49 > 38, сервер старается "спасти" как можно больше значащих цифр в целой части.
Как? Ни где не описано. Ни как не гарантируется.
PetrovichSK
А вот почему тип не соответствует заявленному при s < 6

По этому нет ни какого несоответствия, от s уже ничего не зависет.

Guf, уважаемый, т.е фразу "* Точность и масштаб результата имеют абсолютный максимум, равный 38. Если значение точности превышает 38, то соответствующее значение масштаба уменьшается, чтобы по возможности предотвратить усечение целой части результата." Вы трактуете как "сервер старается "спасти" как можно больше значащих цифр в целой части"?
Тип зависит от самих данных?
29 апр 15, 10:30    [17579729]     Ответить | Цитировать Сообщить модератору
 Re: AVG. Типы возвращаемых значений.  [new]
PetrovichSK
Guest
Glory
Откуда эта формула ?

Glory, уважаемый.Такое трактование у меня возникло по "* Точность и масштаб результата имеют абсолютный максимум, равный 38. Если значение точности превышает 38, то соответствующее значение масштаба уменьшается, чтобы по возможности предотвратить усечение целой части результата."
Как на самом деле?
29 апр 15, 10:34    [17579749]     Ответить | Цитировать Сообщить модератору
 Re: AVG. Типы возвращаемых значений.  [new]
Glory
Member

Откуда:
Сообщений: 104751
PetrovichSK
Glory, уважаемый.Такое трактование у меня возникло по "* Точность и масштаб результата имеют абсолютный максимум, равный 38. Если значение точности превышает 38, то соответствующее значение масштаба уменьшается, чтобы по возможности предотвратить усечение целой части результата."
Как на самом деле?

Вы серьезно счиатете, что для хранения 1 в целой части для вашего примера, нужно усечь дробную часть до 4х знаков ? Без этого никак не получится "предотвратить усечение целой части результата" ?
29 апр 15, 10:36    [17579760]     Ответить | Цитировать Сообщить модератору
 Re: AVG. Типы возвращаемых значений.  [new]
PetrovichSK
Guest
Glory
Вы серьезно счиатете, что для хранения 1 в целой части для вашего примера, нужно усечь дробную часть до 4х знаков ? Без этого никак не получится "предотвратить усечение целой части результата" ?

Пока что я ничего не считаю. Просто пытаюсь понять, как можно трактовать "*" и какой тип будет у данных при делении.
29 апр 15, 10:57    [17579884]     Ответить | Цитировать Сообщить модератору
 Re: AVG. Типы возвращаемых значений.  [new]
Glory
Member

Откуда:
Сообщений: 104751
PetrovichSK
Glory
Вы серьезно счиатете, что для хранения 1 в целой части для вашего примера, нужно усечь дробную часть до 4х знаков ? Без этого никак не получится "предотвратить усечение целой части результата" ?

Пока что я ничего не считаю. Просто пытаюсь понять, как можно трактовать "*" и какой тип будет у данных при делении.

Ну формулу то вы вывели. И почему то считаете, что для "предотвратить усечение целой части результата" дробная часть в вашем примере должна буть усечена именно до 4х знаков
29 апр 15, 10:58    [17579898]     Ответить | Цитировать Сообщить модератору
 Re: AVG. Типы возвращаемых значений.  [new]
PetrovichSK
Guest
Glory
Ну формулу то вы вывели. И почему то считаете, что для "предотвратить усечение целой части результата" дробная часть в вашем примере должна буть усечена именно до 4х знаков

Не преувеличивайте.:) Не вывел а озвучил свою трактовку сноски. Тесты показали, что при s >= 6 так оно и есть. При s < 6 дробная часть результата будет = 6.
29 апр 15, 11:06    [17579945]     Ответить | Цитировать Сообщить модератору
 Re: AVG. Типы возвращаемых значений.  [new]
Glory
Member

Откуда:
Сообщений: 104751
PetrovichSK
Не вывел а озвучил свою трактовку сноски.

И каково это озвучка словами то ?
" Масштаб результата: 15 - (49 - 38) = 4" означает, что нужно всегда уменьшать размер дробной части ?
29 апр 15, 11:11    [17579975]     Ответить | Цитировать Сообщить модератору
 Re: AVG. Типы возвращаемых значений.  [new]
PetrovichSK
Guest
Glory
И каково это озвучка словами то ?
" Масштаб результата: 15 - (49 - 38) = 4" означает, что нужно всегда уменьшать размер дробной части ?

Да. Именно так я и трактовал. Как на самом деле не могу понять. Не подскажете?
29 апр 15, 11:22    [17580067]     Ответить | Цитировать Сообщить модератору
 Re: AVG. Типы возвращаемых значений.  [new]
Glory
Member

Откуда:
Сообщений: 104751
PetrovichSK
Как на самом деле не могу понять. Не подскажете?

Вот так
"Если значение точности превышает 38, то соответствующее значение масштаба уменьшается, чтобы по возможности предотвратить усечение целой части результата"
29 апр 15, 11:32    [17580169]     Ответить | Цитировать Сообщить модератору
 Re: AVG. Типы возвращаемых значений.  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 659
PetrovichSK
Тип зависит от самих данных?

Нет не зависит.
PetrovichSK
* Точность результата: 38. Масштаб результата: 15 - (49 - 38) = 4
результат должен иметь тип decimal(38, 4)
На самом деле decimal(38, 6)

Выделенное придумали вы.
Почему бы не брать процентное соотношение?
AVG - частный случай. Что будет если decimal(38,37) / decimal(38,1)? А наоборот?
В общем разрабртчики сервера так решили, by disign
Не хватает точности? Используй float.
Как-то так...
29 апр 15, 12:32    [17580726]     Ответить | Цитировать Сообщить модератору
 Re: AVG. Типы возвращаемых значений.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Guf
Используй float
Лучше не надо!
Только для хранения значений физических величин с погрешностью измерения.
29 апр 15, 12:35    [17580750]     Ответить | Цитировать Сообщить модератору
 Re: AVG. Типы возвращаемых значений.  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 659
iap,

Ну это я так, для красного словца.
29 апр 15, 12:39    [17580779]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить