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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2022, 21:04   #1
maximum_makarov
Новичок
Джуниор
 
Регистрация: 12.07.2022
Сообщений: 6
Печаль Список максимально средних значений

Добрый день. Столкнулся с задачей где надо вывести СПИСОК производителей компьютеров с максимально средним значением. Базу использовал для примера на sql-ex. Собственно вывести максимальное среднее значение по производителю не беда. А вот почему через HAVING не обрабатываются корректно полученные значения?

Прикладываю код:

Код:
SELECT t2.mx, t2.t2maker FROM (SELECT MAX(avg_price) as mx, t.tmaker as t2maker
FROM (SELECT AVG(price) as avg_price, product.maker as tmaker
      FROM Product 
JOIN PC ON Product.model = PC.model 
      GROUP BY Product.maker) as T
 GROUP BY t.tmaker) t2
   GROUP BY  t2.mx, t2maker
HAVING t2.mx = MAX(MX)
Могу предполагать, что HAVING обрабатывает каждое полученное занчение построчно. Но вроде он должен обрабатывать уже полученный результат. Из за этого собственно вопрос:
Как верно выполнить данную задачу?

Т.е. может быть несколько производителей с одинаковым максимальным средним. Как мне вывети наименование производителей и данное максимальное значение? Требуется добавить еще дополнительно подзапрос?

Вывод с TOP, LIMIT точно не то. Заранее благодарен!

P.S. Код масло масляное. Можно и так:

Код:
SELECT MAX(avg_price) as mx, t.tmaker as t2maker
FROM (SELECT AVG(price) as avg_price, product.maker as tmaker
      FROM Product 
JOIN PC ON Product.model = PC.model 
      GROUP BY Product.maker) as T
 GROUP BY t.tmaker
maximum_makarov вне форума Ответить с цитированием
Старый 12.07.2022, 21:46   #2
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 493
По умолчанию

Чё за БД то?
Valick вне форума Ответить с цитированием
Старый 12.07.2022, 22:18   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
select avg.*
from ( select avg(price) as price, ... group by ...
     ) avg
inner join ( select max(avg) as mm 
             from ( select avg(price) as avg, ... group by ...
                  ) t2
           ) tm on tm.mm =avg.price
Код:
select avg(price), ...group by ...
having avg(price) = ( select max(avg(price)) ... group by ... )
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 13.07.2022, 06:56   #4
maximum_makarov
Новичок
Джуниор
 
Регистрация: 12.07.2022
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Valick Посмотреть сообщение
Чё за БД то?
Зайдите как-нибудь в тренировочную на sql-ex. Я уж думаю все про это слышали...
Да и в принципе понятно по коду о существовании двух связанных таблиц.

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
select avg.*
from ( select avg(price) as price, ... group by ...
     ) avg
inner join ( select max(avg) as mm 
             from ( select avg(price) as avg, ... group by ...
                  ) t2
           ) tm on tm.mm =avg.price
Код:
select avg(price), ...group by ...
having avg(price) = ( select max(avg(price)) ... group by ... )
Благодарю! Вечером проверю.
Примерно так и предполагал, что требуется через сравнение значений с двух таблиц. Уверен что сработает ваш способ!

Вот почему HAVING не отрабатывает? Я думаю он получал значение максимального из столбца AVG и и сравнивал его с текущей AVg в текущей строке? Пытаюсь хоть какую то информацию по алгоритму его работы найти, но безуспешно. Хотя раньше как то не сталкивался с таким. Да и не особо важная проблема, просто хочется разобраться.
Я логику немного не улавливаю...
maximum_makarov вне форума Ответить с цитированием
Старый 13.07.2022, 07:46   #5
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 493
По умолчанию

Ну будем считать, что вы Макар в колодец плюнули. Вместо того, что бы просто ответить на вопрос (хотя по правилам оформления темы на форуме данную информацию вы должны были указать в названии), вы мне предлагаете куда-то там сходить и самому искать нужную информацию. А теперь спросите себя, а оно мне надо?

Последний раз редактировалось Valick; 13.07.2022 в 07:50.
Valick вне форума Ответить с цитированием
Старый 13.07.2022, 09:05   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Вот почему HAVING не отрабатывает? Я думаю он получал значение максимального из столбца AVG
Цитата:
Код:
HAVING t2.mx = MAX(MX)
и левая и правая часть проверяет(вычисляет) значение только по данным ТЕКУЩЕЙ строки набора данных.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 13.07.2022, 12:24   #7
maximum_makarov
Новичок
Джуниор
 
Регистрация: 12.07.2022
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Valick Посмотреть сообщение
Ну будем считать, что вы Макар в колодец плюнули. Вместо того, что бы просто ответить на вопрос (хотя по правилам оформления темы на форуме данную информацию вы должны были указать в названии), вы мне предлагаете куда-то там сходить и самому искать нужную информацию. А теперь спросите себя, а оно мне надо?
Я бы ответил на вопрос, если бы это был запрос уровня senior. В данном запросе не требуются знаний в особенностях написания запроса в разных БД и их строения, так как невооруженным взглядом все видно,что она состоит из двух таблиц с общим ключем.
Зачем мне спрашивать себя, если я уже создал тему, то мне это надо? Логично?
Опытный человек ниже дал сразу четкий ответ без лишних "Че".
maximum_makarov вне форума Ответить с цитированием
Старый 13.07.2022, 12:26   #8
maximum_makarov
Новичок
Джуниор
 
Регистрация: 12.07.2022
Сообщений: 6
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
и левая и правая часть проверяет(вычисляет) значение только по данным ТЕКУЩЕЙ строки набора данных.
Благодарю! Лет 6 не занимался SQL. Восполнили пропажу в памяти)
maximum_makarov вне форума Ответить с цитированием
Старый 13.07.2022, 12:52   #9
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 493
По умолчанию

Цитата:
Сообщение от maximum_makarov Посмотреть сообщение
Я бы ответил на вопрос, если бы это был запрос уровня senior.
Этого вопроса могло бы и не быть, если бы вы ознакомились с правилами форума и грамотно описали название.
Цитата:
В названии темы обязательно должно содержаться название языка программирования, на котором надо решить задачу. Например: "Работа с матрицами (assembler)", "Двусвязанные списки (С++)", "Работа с файлами (Pascal)" и т.д. Если есть требование к IDE или компилятору, то укажите и это в названии темы, например: "Работа с базами данных (Visual С++)", "Чтение и запись структур из файлов (Assembler, MASM)" и т.д.
Впрочем думайте что хотите и как хотите, я уже потерял к вам и к вашим будущим темам интерес.
Valick вне форума Ответить с цитированием
Старый 18.07.2022, 09:10   #10
maximum_makarov
Новичок
Джуниор
 
Регистрация: 12.07.2022
Сообщений: 6
По умолчанию

На памятку. Рабочий вариант.

Код:
SELECT avg.* FROM (SELECT product.maker, AVG(PC.price) as avg_price 
    FROM Product JOIN PC ON PC.model = Product.model GROUP BY product.maker) as avg
JOIN (SELECT MAX(avg_price) as avg_max 
FROM 
    (SELECT product.maker, AVG(PC.price) as avg_price
     FROM Product JOIN PC ON PC.model = Product.model GROUP BY product.maker) as avg_info) as avg2 
ON avg.avg_price = avg2.avg_max
Правда немного запутался с наименование новых таблиц и переменных. Пытался взять переменную avg_price в таб. avg2 из таб. avg во вторую, но они формируются же после выполнения. Но по факут разобрался.
maximum_makarov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа на обработку матрицы (поиск минимумов, максимумов, средних значений и т.д.) hasyanova Паскаль, Turbo Pascal, PascalABC.NET 1 13.12.2013 07:07
Как сделать в Excel подсчет максимально подряд идущих значений alvin81 Microsoft Office Excel 2 28.11.2010 08:07