Northwind每位员工的最大销售额?

时间:2016-05-11 05:30:57

标签: tsql northwind

我试图列出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

但即使我使用该组,我也会重复记录;

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名员工,我使用了顶级功能,但员工并不是唯一的,我也尝试使用不同的功能,但它也没有用。

所以我很感激一只手!

1 个答案:

答案 0 :(得分:0)

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

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

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
相关问题