Как сгруппировать по 1 столбцу при выборе нескольких столбцов - PullRequest
0 голосов
/ 22 декабря 2018

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

что я пробовал:

select concat(SM.FirstName,'-',SM.LastName) AS EmployeeOfTheYear,Year(S.SaleDate) AS SaleYear,Max(S.SalePrice) AS SalesPrice
   from SalesMan SM,Sale S
   where SM.SalesManID = S.SalesManID
   group by Year(S.SaleDate),concat(SM.FirstName,'-',SM.LastName)

Результат:

Result

У меня такое чувство, что я должен сделать здесь подзапрос.Я попытался посмотреть в Интернете и не смог найти ничего, что помогло бы мне отобразить год только один раз.

Ответы [ 3 ]

0 голосов
/ 22 декабря 2018

Вы можете использовать row_number() разбиение по годам и упорядочение по убыванию цены.

SELECT concat(sm.firstname, '-', sm.lastname) employeeoftheyear,
       x.saleyear,
       x.saleprice
       FROM (SELECT year(s.saledate) saleyear,
                    s.salesmanid,
                    max(s.saleprice) saleprice,
                    row_number() OVER (PARTITION BY year(s.saledate)
                                       ORDER BY max(s.saleprice) DESC) rn
                    FROM sale s
                    GROUP BY year(s.saledate),
                             s.salesmanid) x
            LEFT JOIN salesman sm
                      ON sm.salesmanid = x.salemanid
       WHERE x.rn = 1
       ORDER BY x.saleyear DESC;

(Я не знаю, на какой СУБД вы работаете. Большая часть поддержки row_number() в настоящее время.Я надеюсь, что и ваш тоже. Вероятно, это SQL Server, где он должен работать.)

0 голосов
/ 22 декабря 2018

Во-первых, я бы использовал правильный, явный синтаксис JOIN.Во-вторых, наиболее эффективным механизмом часто является коррелированный подзапрос.Это вовсе не агрегация:

select concat(SM.FirstName,'-',SM.LastName) AS EmployeeOfTheYear,
       Year(S.SaleDate) AS SaleYear,
       S.SalePrice AS SalesPrice
from SalesMan SM join
     Sale S
     on SM.SalesManID = S.SalesManID
where s.saleprice = (select max(s2.saleprice)
                     from sale s2
                     where s2.SalesManID = s.SalesManID
                    );

При правильных индексах коррелированный подзапрос часто имеет лучшую производительность, чем альтернативы.

0 голосов
/ 22 декабря 2018

Звучит так, будто вам нужно предложение JOIN.Это вернет только пересечение двух наборов.https://www.w3schools.com/sql/sql_join_inner.asp

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...