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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.03.2012, 11:33   #1
atenon
Форумчанин
 
Регистрация: 05.12.2009
Сообщений: 253
По умолчанию агрегатная функция

Добрых суток столкнулся с небольшой проблемой подскажите пожалуйста как ее решить.
Задание:
Вывести список книг (поле Title_book), у которых количество страниц (поле Pages) больше среднего количества страниц всех книг в таблице.
Подумал что все просто и набрал такой код:
Код:
SELECT Books.Title_book, Books.Pages

FROM Publishing_house INNER JOIN (Deliveries INNER JOIN (Authors INNER JOIN 
(Books INNER JOIN Purchases ON Books.Code_book = Purchases.Code_book) 
ON Authors.Code_author = Books.Code_author) ON Deliveries.Code_delivery = Purchases.Code_delivery) 
ON Publishing_house.Code_publish = Books.Code_publish

WHERE (((Books.Pages)>Avg([Books]![Pages]))); -- здеся ошибка
В Accesse выдает ошибку "Невозможно использование агрегатной функции"
Приходится бежать со всех ног, чтобы только остаться на том же месте! Если хочешь попасть в другое место, тогда нужно бежать по меньшей мере вдвое быстрее! Льюис Кэрол

Последний раз редактировалось Stilet; 09.03.2012 в 11:44.
atenon вне форума Ответить с цитированием
Старый 09.03.2012, 11:45   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Не уверен, но возможно так прокатит
Код:
SELECT Title_book,Pages
  FROM Books
  GROUP BY Title_book,Pages
  HAVING Pages>Avg(Pages)
Так не пойдет. Вот еще вариант (как там с вложенными запросами в Access?)

Код:
SELECT B.Title_book,B.Pages
  FROM Books B
  WHERE B.Pages>(SELECT AVG(B1.Pages) FROM Books B1)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 09.03.2012 в 11:49.
Аватар вне форума Ответить с цитированием
Старый 09.03.2012, 11:47   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А так:
Код:
SELECT Books.Title_book, Books.Pages
where Books.Pages>(select Avg([Books]![Pages]) from Books)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.03.2012, 11:47   #4
atenon
Форумчанин
 
Регистрация: 05.12.2009
Сообщений: 253
По умолчанию

Спасибо.
Но только что проблему решил вложенным запросом, получилось правда объемно но может кому пригодиться.
Код:
SELECT Books.Title_book, Books.Pages
FROM Publishing_house 
 INNER JOIN (Deliveries 
  INNER JOIN (Authors 
   INNER JOIN (Books 
    INNER JOIN Purchases ON Books.Code_book = Purchases.Code_book) 
    ON Authors.Code_author = Books.Code_author) 
   ON Deliveries.Code_delivery = Purchases.Code_delivery) 
  ON Publishing_house.Code_publish = Books.Code_publish
WHERE (((Books.Pages)>(
 SELECT Avg([Books]![Pages]) AS Выражение1
  FROM Publishing_house 
  INNER JOIN (Deliveries 
   INNER JOIN (Authors 
    INNER JOIN (Books 
     INNER JOIN Purchases ON Books.Code_book = Purchases.Code_book) 
    ON Authors.Code_author = Books.Code_author) 
   ON Deliveries.Code_delivery = Purchases.Code_delivery) 
  ON Publishing_house.Code_publish = Books.Code_publish;
)));
Одновременно со Stilet выложили ))
Приходится бежать со всех ног, чтобы только остаться на том же месте! Если хочешь попасть в другое место, тогда нужно бежать по меньшей мере вдвое быстрее! Льюис Кэрол

Последний раз редактировалось Stilet; 09.03.2012 в 12:13.
atenon вне форума Ответить с цитированием
Старый 09.03.2012, 12:14   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Мощный запросик.
Форматируй его пожалуйста в следующий раз читабельно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.03.2012, 11:00   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

исходное требование
Цитата:
больше среднего количества страниц всех книг в таблице.
не предусматривает ограничений в рассчете среднего
(не нужны многочисленные Inner join )
Код:
SELECT Avg([Books]![Pages]) AS Выраж7ение1
  FROM Publishing_house 
  INNER JOIN (Deliveries 
   INNER JOIN (Authors 
    INNER JOIN (Books 
     INNER JOIN Purchases ON Books.Code_book = Purchases.Code_book) 
    ON Authors.Code_author = Books.Code_author) 
   ON Deliveries.Code_delivery = Purchases.Code_delivery) 
  ON Publishing_house.Code_publish = Books.Code_publish;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 11.03.2012, 20:16   #7
atenon
Форумчанин
 
Регистрация: 05.12.2009
Сообщений: 253
По умолчанию

Точно )))))
Приходится бежать со всех ног, чтобы только остаться на том же месте! Если хочешь попасть в другое место, тогда нужно бежать по меньшей мере вдвое быстрее! Льюис Кэрол
atenon вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция. ХреновыйПрогер Общие вопросы C/C++ 3 23.11.2010 00:00
функция golf Помощь студентам 4 14.11.2009 16:27
Агрегатная функция SUM для DateTime _SERGEYX_ БД в Delphi 6 09.02.2009 12:40
Функция Lemo Помощь студентам 1 02.12.2008 00:24
одна функция потока, а другая функция - член класса запускающего этот поток Дмитрий_Ч Общие вопросы C/C++ 2 27.09.2007 08:50