2016-03-19 2 views
1

У меня есть таблица OrderLine выглядит следующим образомКак совместить значение с функцией SQL max (count)?

enter image description here

Я хотел бы знать, какая пицца является лучшим продавцом, а количество пиццы продается.

Я попытался запрос:

select sum(quantity), pizza_name from order_line group by pizza_name; 

возвращает

enter image description here

который почти то, что я хочу, но когда я начинаю добавлять функцию Макс, он не может совпадать с именем пиццы с общим количеством проданной пиццы

Например:

select MAX(sum(quantity)), pizza_name from order_line group by pizza_name; 

он возвращает следующее сообщение об ошибке:

"not a single-group group function"

Я предполагаю, что я мог бы добиться этого с помощью суб-запроса, но я понятия не имею, как это сделать.

ответ

1

Для этого не нужен max. Если вы хотите только одну пиццу, то вы можете использовать order by и fetch first 1 row only (или что-то подобное, такие как limit или top):

select sum(quantity), pizza_name 
from order_line 
group by pizza_name 
order by sum(quantity) 
fetch first 1 row only; 

Или, если вы хотите, чтобы все такие пиццы, используйте rank():

select p.* 
from (select sum(quantity) as quantity, pizza_name, 
      rank() over (order by sum(quantity) desc) as seqnum 
     from order_line 
     group by pizza_name 
    ) p 
where seqnum = 1; 
+0

Это действительно полезно! Кстати, могу ли я достичь этого, используя sub_query? – Felicia

0

Оба запросов дают один и тот же желаемый результат

SELECT PIZZA_NAME, 
    SUM(QUANTITY) "Total Quant" 
FROM Order_line 
GROUP BY PIZZA_NAME 
ORDER BY "Total Quant" DESC 
FETCH FIRST 1 row only; 

SELECT PIZZA_NAME, "Total Quantity" FROM (
SELECT PIZZA_NAME,SUM(QUANTITY) "Total Quantity", RANK() OVER (ORDER BY SUM(QUANTITY) DESC) T FROM Order_line GROUP BY PIZZA_NAME 
) query1 where query1.T=1 ; 
+0

Это тот же ответ, что и тот, который уже дал Гордон Линофф шесть часов назад. –

+0

Я никогда не вижу, что другие люди публикуют в своем ответе :). Я вижу вопрос, и я пытаюсь ответить на него, больше практики для меня. – Sandeep

0

вас группу по pizza_name, чтобы получить сумму (количество) на имя pizza_name.

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

Если вы хотите использовать свой запрос, вы должны применить соответствующую функцию агрегации для pizza_name, которая является KEEP DENSE_RANK FIRST/LAST.

select 
    max(sum(quantity)), 
    max(pizza_name) keep (dense_rank last order by sum(quantity)) 
from order_line 
group by pizza_name; 

Но с одной стороны, запросы Гордона более читабельны, на мой взгляд. А с другой стороны, это двойное агрегирование - это Oracle, а не стандарт SQL. Неопытные читатели могут быть смущены тем, что запрос создает одну строку результатов, несмотря на предложение GROUP BY.

Смежные вопросы