Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

PostgreSQL

Войти
Регистрация
Восстановить пароль
 
Trigger_name
0 / 0 / 0
Регистрация: 11.11.2016
Сообщений: 28
#1

Как использовать локальное представления? - PostgreSQL

22.11.2016, 21:33. Просмотров 387. Ответов 9
Метки нет (Все метки)

Получить информацию о яхтах, приносящих максимальный средний доход своим владельцам (воспользоваться «локальным» представлением).

решаю задачу таким образом, но не могу въехать как получить максимальный средний доход, и при этом пользоватся локальным представлениям(

SQL
1
2
3
4
5
CREATE VIEW "OwnerView" AS
SELECT o."FullName",COUNT (y."OwnerId"), AVG (c."Price") , MAX (c."Price")
FROM "Owner" AS o, "Yacht" AS y, "Contract" AS c
WHERE o."OwnerId" = y."OwnerId" AND y."YachtId" = c."YachtId"
GROUP BY  o."FullName"
0
Миниатюры
Как использовать локальное представления?  
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.11.2016, 21:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как использовать локальное представления? (PostgreSQL):

Локальное хранение списка деревьев - Базы данных
Есть сущность - ссылка. У ссылки есть категории к которым принадлежит ссылка. Решил категории сделать списком древовидных структур. То...

Как использовать TimeStamp в VB. - Базы данных
Добрый день, кто подскажет, каким образом можно использовать SQL-ную переменную типа timestamp в VB. У меня, как ни крути, пробелы с...

Как использовать me.orderby ??? - Базы данных
Как использовать me.orderby ??? при попытке выполнить me.orderby 'ПОЛЕ СОРТИРОВКИ' возникает ошибка Invalid use of property

Как использовать SQL? - Базы данных
Не подскажете, как можно открыть Recordset на основе SQL запроса? Т.е. создаю компоненту Data1, определяю объектную переменную dim Total as...

Как правильно использовать While? - Базы данных
Не давно столкнулся с необходимостью использовать цикл While . Ранее сталкивался с ним только в языках программирования . Задача...

Как использовать SUBSTR? - Базы данных
Пытаюсь сделать join 2-х таблиц в Access Query... И нужно получить первые 6 символов столбца, но SUBSTR(COLUMN,1,6) не работает! Как...

9
Trigger_name
0 / 0 / 0
Регистрация: 11.11.2016
Сообщений: 28
23.11.2016, 12:01  [ТС] #2
все, вроде бы решил)
SQL
1
2
3
4
5
CREATE VIEW "Max_Salary" AS
SELECT o."FullName",  ROW_NUMBER() OVER (ORDER BY AVG (c."Price") , MAX (c."Price")) 
FROM "Owner" AS o, "Yacht" AS y, "Contract" AS c
WHERE o."OwnerId" = y."OwnerId" AND y."YachtId" = c."YachtId"
GROUP BY  o."FullName"
0
grgdvo
561 / 499 / 146
Регистрация: 02.09.2012
Сообщений: 1,480
23.11.2016, 15:14 #3
Не то чтобы меня это волнует, но мне кажется, что запрос не соответствует заданию.
0
Trigger_name
0 / 0 / 0
Регистрация: 11.11.2016
Сообщений: 28
23.11.2016, 15:16  [ТС] #4
grgdvo, а как его можно сделать по другому?
0
grgdvo
561 / 499 / 146
Регистрация: 02.09.2012
Сообщений: 1,480
23.11.2016, 16:07 #5
если бы я сдавал, я бы сделал так

делаем представление о среднем доходе каждой яхты (не знаю, почему у вас его называют "локальным").
средний доход - это сумма всех контрактов яхты, разделенное на количество контрактов этой яхты.
SQL
1
2
3
4
CREATE VIEW "YachtDohod" AS
SELECT c."YachtId", SUM(c."Price") / COUNT(c."YachtId") AS "Dohod"
FROM "Contract" AS c
GROUP BY c."YachtId";
Далее подсчитываем максимальный средний доход и отбираем яхты только с максимальным доходом
SQL
1
2
3
4
5
6
SELECT "OwnerId", "YachtId", "Name", "Dohod"
FROM
(SELECT y."OwnerId", y."YachtId", y."Name", yd."Dohod", MAX(yd."Dohod") OVER (PARTITION BY "OwnerId") AS "MaxDohod"
FROM "Yacht" AS y, "YachtDohod" AS yd
WHERE y."YachtId" = yd."YachtId") subquery
WHERE "Dohod" = "MaxDohod";
Вроде так

Добавлено через 2 минуты
ооо!!... ну и в представлении "YachtDohod" конечно можно SUM / COUNT заменить на AVG(c."Price").
это я слишком углубился в написание запроса
0
Trigger_name
0 / 0 / 0
Регистрация: 11.11.2016
Сообщений: 28
23.11.2016, 21:41  [ТС] #6
так это же два запроса, а нужно одним сделать)

Добавлено через 32 минуты
и еще оно чет не работает
0
grgdvo
561 / 499 / 146
Регистрация: 02.09.2012
Сообщений: 1,480
23.11.2016, 23:53 #7
Цитата Сообщение от Trigger_name Посмотреть сообщение
и еще оно чет не работает
ошибку пишет?? или не те данные считает??

Цитата Сообщение от Trigger_name Посмотреть сообщение
так это же два запроса
вам не угодишь... а все же... что такое "локальное" представление??

SQL
1
2
3
4
5
6
7
8
9
10
WITH "YachtDohod" ("YachtId", "Dohod") AS
(SELECT c."YachtId", AVG(c."Price")  AS "Dohod"
FROM "Contract" AS c
GROUP BY c."YachtId")
SELECT "OwnerId", "YachtId", "Name", "Dohod"
FROM
(SELECT y."OwnerId", y."YachtId", y."Name", yd."Dohod", MAX(yd."Dohod") OVER (PARTITION BY "OwnerId") AS "MaxDohod"
FROM "Yacht" AS y, "YachtDohod" AS yd
WHERE y."YachtId" = yd."YachtId") subquery
WHERE "Dohod" = "MaxDohod";
0
Trigger_name
0 / 0 / 0
Регистрация: 11.11.2016
Сообщений: 28
25.11.2016, 21:55  [ТС] #8
grgdvo, локальное представления это когда во FROM используют SELECT.
У меня вопрос этот запрос возвращает только среднее арифметическое контрактов каждой яхты.
SQL
1
2
3
4
5
6
7
8
9
10
WITH "YachtDohod" ("YachtId", "Dohod") AS
(SELECT c."YachtId", AVG(c."Price")  AS "Dohod"
FROM "Contract" AS c
GROUP BY c."YachtId")
SELECT "OwnerId", "YachtId", "Name", "Dohod"
FROM
(SELECT y."OwnerId", y."YachtId", y."Name", yd."Dohod", MAX(yd."Dohod") OVER (PARTITION BY "OwnerId") AS "MaxDohod"
FROM "Yacht" AS y, "YachtDohod" AS yd
WHERE y."YachtId" = yd."YachtId") subquery
WHERE "Dohod" = "MaxDohod";
Как я понял здесь нужно сначала посчитать среднее арифметическое контракта каждой яхты, а потом вывести какой из контрактов каждой яхты есть самым большим.
Но как это сделать я не могу понять.
0
grgdvo
561 / 499 / 146
Регистрация: 02.09.2012
Сообщений: 1,480
26.11.2016, 00:31 #9
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Trigger_name Посмотреть сообщение
У меня вопрос этот запрос возвращает только среднее арифметическое контрактов каждой яхты.
Нет, возвращает максимальное среднее по каждой яхте

Цитата Сообщение от Trigger_name Посмотреть сообщение
Но как это сделать я не могу понять.
Подставьте вместо "YachtDohod" запрос из WITH

SQL
1
2
3
4
5
6
7
SELECT "OwnerId", "YachtId", "Name", "Dohod"
FROM
  (SELECT y."OwnerId", y."YachtId", y."Name", yd."Dohod", MAX(yd."Dohod") OVER (PARTITION BY "OwnerId") AS "MaxDohod"
  FROM "Yacht" AS y, 
           (SELECT c."YachtId", AVG(c."Price")  AS "Dohod" FROM "Contract" AS c GROUP BY c."YachtId") AS yd
  WHERE y."YachtId" = yd."YachtId") subquery
WHERE "Dohod" = "MaxDohod";
1
Trigger_name
0 / 0 / 0
Регистрация: 11.11.2016
Сообщений: 28
01.12.2016, 22:46  [ТС] #10
grgdvo, спасибо)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.12.2016, 22:46
Привет! Вот еще темы с ответами:

Как использовать параметр в функции? - PostgreSQL
Добрый день столкнулся с такой задачей( Составить хранимую процедуру для реализации факта аренды яхты и отображения контракта в виде...

Как использовать битовую маску в Postgres - PostgreSQL
Хотелось бы в поле писать несколько параметров. Например 10 - это 1- виден 0 - включен. Т.е. это можно записать в десятичной форме как 2 ...

Как использовать временную таблицу в фильтре WHERE ? - Базы данных
SELECT fio, sum_price FROM (select fio, SUM(price) as sum_price FROM table GROUP BY fio) AS qq WHERE sum_price = (select MAX(sum_price)...

Как получить нужные данные из представления , а именно строки представления - C++ Qt
Доброго времени суток. на главной форме у меня информация выводится через представление zews... информация в него попадает если запись...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Yandex
Объявления
01.12.2016, 22:46
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru