Как показать ТОЛЬКО максимальное значение внутреннего столбца таблицы соединений? - PullRequest
1 голос
/ 01 июня 2019

Я использовал INNER JOIN для двух таблиц:

Transactions 
 - transaction_id (PK)
 -ticket_id (FK) reference to ticketsforsale

Ticketsforsale : 
 - ticket_id (PK)
 - type
 - price 

(в каждой таблице больше столбцов, но для этого вопроса нет цели)

запрос, который я пробовал, выглядит следующим образом:

SELECT ticketsforsale.type , SUM(ticketsforsale.price) AS TotalProfit
   FROM ticketsforsale INNER JOIN transactions 
   ON ticketsforsale.ticket_id = transactions.ticket_id 
GROUP BY ticketsforsale.type 

The result is : 
  Sports | 300
  Cruise | 600
  Theater| 100

Я пытался использовать эту строку в запросе

WHERE TotalProfit = SELECT(MAX(TotalProfit)

Но я не могу найти правильное место для этой строки.

Я хочу, чтобы запрос показывал только строку, содержащую максимальное значение «TotalProfit». Я просто пропускаю правильное использование функции MAX в этом запросе, спасибо!

Ответы [ 2 ]

3 голосов
/ 01 июня 2019

Используйте ORDER BY и ограничьте результирующий набор одной строкой:

SELECT tfs.type , SUM(tfs.price) AS TotalProfit
FROM ticketsforsale tfs INNER JOIN
     transactions t 
     ON tfs.ticket_id = t.ticket_id 
GROUP BY tfs.type 
ORDER BY TotalProfit DESC
FETCH FIRST 1 ROW ONLY;

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

Судя по этому запросу, вам не нужно JOIN:

SELECT tfs.type , SUM(tfs.price) AS TotalProfit
FROM ticketsforsale tfs 
GROUP BY tfs.type 
ORDER BY TotalProfit DESC
FETCH FIRST 1 ROW ONLY;
2 голосов
/ 01 июня 2019

Вы можете использовать CTE и выбрать только одну строку на основе значений TotalProfit.

with cte as (
SELECT ticketsforsale.type , SUM(ticketsforsale.price) AS TotalProfit
   FROM ticketsforsale INNER JOIN transactions 
   ON ticketsforsale.ticket_id = transactions.ticket_id 
GROUP BY ticketsforsale.type 
)
select *
from cte 
order by TotalProfit desc
limit 1

Если вы хотите использовать max(), вы можете сделать что-то вроде этого:

with cte as (
SELECT ticketsforsale.type , SUM(ticketsforsale.price) AS TotalProfit
   FROM ticketsforsale INNER JOIN transactions 
   ON ticketsforsale.ticket_id = transactions.ticket_id 
GROUP BY ticketsforsale.type 
)
select *
from cte 
where TotalProfit = (select max(TotalProfit) from cte)
...