我试图从一个表中获取员工信息,同时对另一个表中的列进行分组,我似乎正在重复。 我需要按年份分组,同时显示当年销售额最高的员工。
我尝试了什么:
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)
结果:
我觉得我应该在这里进行子查询。我曾尝试在网上查找内容,但找不到任何可帮助我仅显示一次的年份。
答案 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
);
有了正确的索引,相关子查询通常比其他子查询具有更好的性能。