Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.01.2012, 01:18   #1
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,385
По умолчанию Postgre: средний возраст, количество знаков

Дорогие форумчане, посоветуйте как граммотно решить проблему. Я нашла средний возраст детей из садика (через average avg), а мне надо чтобы запрос вывел этот средний возраст не с 1 а с 3 знаками после запятой. Я уже пересмотрела документацию по "слону", и что-то пока решение не попалось на глаза. Все рекомендуют заранее задавать формат колонки таблицы... А мне надо, чтобы запрос вернул так, как спрашивается в контрольном задании. В какую "обертку" результат avg завернуть, чтобы было с нужным количеством дробных значений?
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan
Blondy вне форума Ответить с цитированием
Старый 17.01.2012, 01:35   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

AVG(ROUND(возраст,3)) не пойдет?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.01.2012, 01:40   #3
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,385
По умолчанию

Счас проверим))

function avg(double precision, integer) does not exist(((
function round(double precision, integer) does not exist(((((

Не хотит такого
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan
Blondy вне форума Ответить с цитированием
Старый 17.01.2012, 01:45   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А что за проблемы вот два мануала по AVG и ROUND, вроде должно прокатить
"возраст" должен быть целый или numeric
http://www.postgresql.org/docs/8.2/s...aggregate.html
http://www.postgresql.org/docs/7.2/s...ions-math.html

add - и вся конструкция в SELECT-е должна быть само собой
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 17.01.2012 в 01:53.
Аватар вне форума Ответить с цитированием
Старый 17.01.2012, 02:31   #5
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,385
По умолчанию

Я видела эти мануалы. А сама удивляюсь, все должно работать, а он - нету такого, нету такого. Вот:
Код:
SELECT DISTINCT SUBSTRING("Kids".group,1,4),----Выводим номер группы
---Выводим средний возраст из кода ребенка
ROUND(avg(date_part('year',age(to_date(SUBSTRING("Kids".id_code,2,6), 'yymmdd')))),3)
FROM "Kids"
GROUP BY  SUBSTRING("Kids".group,1,4)

Вот что пишет:
Цитата:
ERROR: function round(double precision, integer) does not exist
HINT: No function matches the given name and argument types. You may need to add explicit type casts.
Несовпадение функции по передаваемым агрументам, типа
Без ROUND средний возраст выдается прекрасно
Код ребенка содержит год рождения, месяц и день и идентификационные цифры
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan

Последний раз редактировалось Blondy; 17.01.2012 в 02:36.
Blondy вне форума Ответить с цитированием
Старый 17.01.2012, 08:22   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

когда то давным-давно возникла подобная (не точно такая, но суть тоже в потере точности) проблема в FoxPro (FPD 2.6)

попробуйте такой код:
Код:
select 1.000 * AVG(возраст) from ...
если он не даст требуемого результата, тогда попробуйте такой код:

Код:
select AVG(возраст*1000)/1000 from ...
ну, если и это не даст требуемого решения, тогда можно попробовать так:
Код:
select AA.SumChildrenAge/AA.CountChildren as AvgChildrenAge from 
( select sum(возраст) as SumChildrenAge , count(*) as CountChildren   from .. where ... ) AA
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.01.2012, 14:26   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
ROUND(avg(date_part('year',age(to_d ate(SUBSTRING("Kids".id_code,2,6), 'yymmdd')))),3)
AVG возвращает double precision, а для ROUND в качестве первого аргумента NUMERIC нужен.
Можно результат AVG CAST-ом преобразовать в NUMERIC (или NUMERIC (6,3) например). Может этого и достаточно. Если не достаточно, то над результатом преобразования сделать ROUND(...,3)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 17.01.2012 в 14:55.
Аватар вне форума Ответить с цитированием
Старый 17.01.2012, 16:50   #8
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,385
По умолчанию

Все спасибо!
Съел так:
Код:
ROUND(CAST(avg(date_part('year',age(to_date(SUBSTRING("Kids".id_code,2,6), 'yymmdd')))) AS NUMERIC),3)
Я поняла, в чем была ошибка: я то хотела выбрать ROUND с дробной частью, а смотрела в мануале строчкой выше, ROUND округление до целого, который возвращает double precision (те же единицы, как и все длинное выражение). А округлитель с дробной частью работет и возвращает только numeric .
Я чувствую, на контрольной приплыву - я с первого раза хорошо контрольную не написала из-за того, что заблудилась в трех соснах с возвращаемыми значениями форматов.
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan
Blondy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как посчитать количество знаков PARTOS Microsoft Office Excel 11 05.06.2010 22:46
Количество знаков Flangini Microsoft Office Excel 9 02.07.2009 15:22
Сделайте, пожалуйста, задачку про средний возраст! BeaU Помощь студентам 5 05.06.2009 17:12
Сделайте, пожалуйста, задачку про средний возраст! BeaU Паскаль, Turbo Pascal, PascalABC.NET 1 05.06.2009 16:27
Пощитать количество знаков в RichEdit Vladya Помощь студентам 3 05.03.2009 17:08