Мне кажется странным, что я не могу написать следующее
SELECT avg(price) FROM PC
,
а вынужден делать двойное преобразование типа, да еще и вычищать форматирование:
SELECT avg(regexp_replace(price::text, '[$,]', '', 'g')::numeric) FROM pc;
Хотя с другой стороны, я могу написать так:
SELECT sum(price)/count(price) AS avg_foo FROM pc;
Что характерно, я получаю в последнем случае в качестве результата тип money, что и должно бы быть при использовании функции AVG, т.к. согласно стандарта, результат агрегата наследует тип данных аргумента.
Предполагаю, что тема избита, поэтому хотелось хотя бы получить ссылку на объяснение такого поведения.
Странно всё это. А вы можете
Странно всё это. А вы можете дать табличку для примера, чтобы я у себя попробовал?
Конечно
Можете также попробовать из консоли (используется та же база), правда, там пока ошибка не выводится.
Ага. Ну вот собственно я
Ага. Ну вот собственно я выполнил SELECT и увидел причину:
Т.е. для типа money не существует агрегатная функция avg, поэтому и не работает то, что вы хотите.
И нарушением стандарта это не является. Например avg также не будет существовать для типа DATE.
Теперь идём в мануал на страницу посвещённую агрегатным функциям:
http://postgresql.ru.net/manual/functions-aggregate.html
и видим, что данная функция работает только для типов: smallint, int, bigint, real, double precision, numeric, or interval
Собственно добавить тут больше нечего.
Это я прочитал
: Т.е. для типа money не существует агрегатная функция avg, поэтому и не работает то, что вы хотите.
Читать я умею.
Мне непонятно, почему это она не существует, если существует sum/count?
: И нарушением стандарта это не является. Например avg также не будет существовать для типа DATE.
Не думаю, что это так. Для DATE не существует sum/count, поскольку это лишено смысла, а средняя цена или стоимость имеет вполне определенный смысл.
Да, что касается стандарта, то там (SQL:2003) денежного типа нет вообще. Но я думаю, что если он появится, то AVG для него будет существовать, как для других числовых типов.
Мне непонятно, почему это она
Мне непонятно, почему это она не существует, если существует sum/count?
Потому что так решили разработчики. Вообще насколько я помню мануал, там написано, что тип money оставлен для совместимости, но настоятельно рекомендуется использовать вместо него numeric
Кстати судя по тому же мануалу, написать агрегатную функцию для этого типа не особенно сложно.