Запрос, собирающий максимальное значение подзапроса, возвращающего несколько значений - PullRequest
0 голосов
/ 13 мая 2019

Я столкнулся с другой проблемой с запросами SQL в базе данных Oracle, которую я не могу решить. У меня есть 3 таблицы, две из которых собирают информацию о некоторых пользователях и структурах, а другая - сбор заявок на конструкцию. Благодаря запросу я смогу отобразить имя пользователя, который сделал максимальное количество бронирований для сооружения в определенном городе , в данном случае «Torre annunziata».

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

SELECT P.UTENTE, COUNT(Case when S.Citta = 'Torre Annunziata' then 1 else null end) as cnt
FROM PRENOTAZIONI P JOIN STRUTTURE S ON P.STRUTTURA = S.CODICE JOIN UTENTI ON P.UTENTE = UTENTI.CF
GROUP BY P.UTENTE;

Это дает желаемый результат: table1

Теперь я попробовал следующее:

SELECT UTENTI.NOME, UTENTI.COGNOME, MAX(cnt)
FROM UTENTI JOIN ( SELECT P.UTENTE, COUNT(Case when S.Citta = 'Torre Annunziata' then 1 else null end) as cnt
                    FROM PRENOTAZIONI P JOIN STRUTTURE S ON P.STRUTTURA = S.CODICE JOIN UTENTI ON P.UTENTE = UTENTI.CF
                    GROUP BY P.UTENTE) L ON UTENTI.CF = L.UTENTE
GROUP BY UTENTI.COGNOME, UTENTI.NOME;

Но это возвращает тот же результат предыдущего запроса (с именами каждого человека).

Исходя из моего запроса, я ожидаю получить имя и фамилию пользователя 0000000002, возможно, без отображения максимального значения.

Я знаю, что функция MAX возвращает значение для каждого пользователя, и поэтому я искал альтернативы для oracle, но не могу найти решение, которое можно применить к моей проблеме. Я надеюсь, что кто-то сможет мне помочь. Заранее спасибо и извините за мой плохой английский.

1 Ответ

1 голос
/ 13 мая 2019

Вы не хотите агрегации.Вместо этого используйте оконные функции.Если вы хотите связи:

SELECT u.*
FROM UTENTI u JOIN
     (SELECT P.UTENTE, u.NOME, u.COGNOME, COUNT(*) as cnt,
             RANK() OVER (ORDER BY COUNT(*) DESC) as seqnum
      FROM PRENOTAZIONI P JOIN
           STRUTTURE S
           ON P.STRUTTURA = S.CODICE JOIN
           UTENTI u
           ON P.UTENTE = u.CF
      WHERE S.Citta = 'Torre Annunziata'
      GROUP BY P.UTENTE, u.NOME, u.COGNOME
     ) u
WHERE seqnum = 1;

Примечания:

  • Вам не нужно JOIN таблица UTENTI дважды.
  • Условие фильтрации можетвведите предложение WHERE.
  • Используйте ROW_NUMBER() вместо RANK(), если вы хотите ровно одну строку, даже если есть связи.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...