Как проверить, в какой категории каждый сотрудник продал больше всего товаров? Я могу отображать только имя сотрудника и проданный товар

Весь стол

USE Northwind
SELECT MAX(TotalOrder)


FROM vwEmployesAndMostSoldCategories
GROUP MAX(TotalOrder)

Что я могу только вывести

USE Northwind
SELECT
   FullName
   , MAX(TotalOrder) AS TheMaxSoldUnits
FROM vwEmployesAndMostSoldCategories
GROUP BY FullName

введите здесь описание изображения


person AlexeyOrel    schedule 21.11.2020    source источник


Ответы (2)


Вы можете использовать запрос TOP здесь:

WITH cte AS (
    SELECT FullName, CatgegoryName,
           SUM(TotalOrder) AS SumTotalOrder,
           ROW_NUMBER() OVER (PARTITION BY FullName
                              ORDER BY SUM(TotalOrder) DESC) rn
    FROM vwEmployesAndMostSoldCategories
    GROUP BY FullName, CategoryName
)

SELECT FullName, CategoryName, SumTotalOrder AS TotalOrder
FROM cte
WHERE rn = 1;

Если данный сотрудник может быть связан из-за наличия двух или более категорий с одинаковой суммой заказа, и вы хотите показать все связи, замените ROW_NUMBER на RANK.

person Tim Biegeleisen    schedule 21.11.2020
comment
Извините, я задал неправильный вопрос. Мне нужно выяснить, в какой категории каждый сотрудник продал больше всего товаров. Не знаю, почему я не могу вывести 3 столбца с сотрудником+Категория+Общие единицы, - person AlexeyOrel; 21.11.2020
comment
@AlexeyOrel ... урок усвоен, пожалуйста, всегда показывайте начальные и конечные данные в своем вопросе SQL. В любом случае, я обновил то, что, по моему мнению, ваш вопрос действительно задает. - person Tim Biegeleisen; 21.11.2020
comment
Чувак! Вы мне очень помогли! Это был мой первый комментарий на этом легендарном сайте =) Желаю вам всего наилучшего! - person AlexeyOrel; 21.11.2020

Если я правильно понял, вы можете сделать это, используя with ties:

select top (1) with ties e.*
from vwEmployesAndMostSoldCategories e
order by rank() over(partition by fullname order by totalorders desc)

Для каждого сотрудника это возвращает строку с наибольшим totalorders (если есть верхние связи, возвращаются все связанные строки одного и того же сотрудника). Не похоже, что вам нужна агрегация здесь.

person GMB    schedule 21.11.2020
comment
@ GMB Не могли бы вы сказать мне, что означает e в этом случае? Я попробовал ваше предложение, но для меня это не работает - person AlexeyOrel; 21.11.2020
comment
@AlexeyOrel: e — это псевдоним для vwEmployesAndMostSoldCategories в запросе. Что не так в результатах, которые вы получаете по этому запросу? - person GMB; 21.11.2020
comment
Сообщение 208, уровень 16, состояние 1, строка 1 Недопустимое имя объекта «vwEmployesAndMostSoldCategories». Не знаю, как выполнить этот запрос, похоже, чего-то не хватает. У вас есть идея, как написать этот запрос без псевдонима? Я начал изучать SQL в течение месяца, поэтому этот псевдоним меня смущает. - person AlexeyOrel; 22.11.2020
comment
@AlexeyOrel: просто запустите запрос как есть. Это не вызовет эту ошибку. - person GMB; 22.11.2020
comment
Я уже пробовал, но получил ошибку и не знаю почему: Недопустимое имя объекта 'vwEmployesAndMostSoldCategories' - person AlexeyOrel; 22.11.2020