0

我正在尝试在 Northwind 数据库中列出每位员工的最大销售额,到目前为止,我能做的最好的就是这个;

select top (select count(EmployeeID) from Employees)     
    max(Quantity*OrderDetails.UnitPrice) TotalSale, FirstName+' '+LastName Name, ProductName  from Orders 
left join OrderDetails
    on
        OrderDetails.OrderID=Orders.OrderID
left join Employees
    on
        Orders.EmployeeID=Employees.EmployeeID
left join Products
    on
        OrderDetails.ProductID=Products.ProductID

group by FirstName,LastName, ProductName

order by TotalSale desc

但是即使我使用了 group by 我也得到了重复的记录;

TotalSale             Name                            ProductName
15810,00              Andrew Fuller                   Côte de Blaye
15810,00              Nancy Davolio                   Côte de Blaye
10540,00              Robert King                     Côte de Blaye
10540,00              Anne Dodsworth                  Côte de Blaye
10540,00              Margaret Peacock                Côte de Blaye
9903,20               Janet Leverling                 Thüringer Rostbratwurst
8432,00               Steven Buchanan                 Côte de Blaye
7905,00               Janet Leverling                 Côte de Blaye
7427,40               Andrew Fuller                   Thüringer Rostbratwurst
Warning: Null value is eliminated by an aggregate or other SET operation.

(9 row(s) affected)

所以我有 9 名员工,我为此使用了顶级功能,但员工并不是唯一的,我也尝试使用不同的功能,但它也不起作用。

所以我会很感激你的手!

4

1 回答 1

0

您的问题是您还按产品名称分组。因此,您将获得每位员工和每个产品名称的最大销售额。

您可以做的是,将产品名称放入 group by,在这种情况下,您只会看到每位员工的最大总销售额。

select max(Quantity*OrderDetails.UnitPrice) TotalSale, FirstName+' '+LastName Name
from Orders 
left join [Order Details] as OrderDetails on OrderDetails.OrderID=Orders.OrderID
left join Employees on Orders.EmployeeID=Employees.EmployeeID
left join Products on OrderDetails.ProductID=Products.ProductID
group by FirstName,LastName
order by TotalSale desc

如果您还想查看产品名称,可以将查询封装在子查询中,并根据员工姓名和按总销售额的顺序创建一个 rownum。您可以在外部查询中选择 rownum 为 1 的行。如果您需要显示所有出现的产品名称,请使用排名功能。

SELECT TotalSale, Name, ProductName
FROM
(
    select max(Quantity*OrderDetails.UnitPrice) TotalSale
        ,FirstName + ' ' + LastName Name
        ,ProductName
        ,Rnk = Rank() OVER(PARTITION BY Employees.EmployeeId ORDER BY MAX(Quantity*OrderDetails.UnitPrice) DESC)
    from Orders 
    left join [Order Details] as OrderDetails on OrderDetails.OrderID=Orders.OrderID
    left join Employees on Orders.EmployeeID=Employees.EmployeeID
    left join Products on OrderDetails.ProductID=Products.ProductID
    group by FirstName,LastName, Employees.EmployeeId, ProductName
) as sub
where sub.Rnk = 1
order by Name
于 2016-05-11T08:13:36.330 回答