如何在选择多列时按1列分组

时间:2018-12-22 15:57:25

标签: sql group-by

我试图从一个表中获取员工信息,同时对另一个表中的列进行分组,我似乎正在重复。 我需要按年份分组,同时显示当年销售额最高的员工。

我尝试了什么:

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 :(得分:1)

听起来像您需要一个JOIN子句。这将仅返回两个集合的交集。 https://www.w3schools.com/sql/sql_join_inner.asp

答案 1 :(得分:1)

您可以按年份使用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;

(我不知道您使用的是哪个DBMS。如今,大多数支持row_number()。我希望您也支持。应该在SQL Server上运行。)

答案 2 :(得分:1)

首先,我将使用正确的显式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
                    );

有了正确的索引,相关子查询通常比其他子查询具有更好的性能。