[英]How to group by 1 column while selecting a multiple columns
我試圖從一個表中獲取員工信息,而對另一個表中的列進行分組,我似乎正在重復。 我需要按年份分組,同時顯示當年銷售額最高的員工。
我試過的
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)
結果:
我有一種感覺,我應該在這里進行子查詢。 我嘗試在網絡上查找內容,卻找不到任何可以幫助我僅顯示一次的年份。
聽起來您需要一個JOIN子句。 這將僅返回兩個集合的交集。 https://www.w3schools.com/sql/sql_join_inner.asp
您可以按年份使用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上運行。)
首先,我將使用正確的顯式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
);
使用正確的索引,相關子查詢通常具有比替代方法更好的性能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.