簡體   English   中英

如何在選擇多列時按1列分組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM