【问题标题】:Biggest sale of every employee on Northwind?Northwind 上每位员工的最大销售额?
【发布时间】:2016-05-11 05:30:56
【问题描述】:

我正在尝试在 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 名员工,为此我使用了 top 函数,但员工不是唯一的,我也尝试使用 distinct 函数,但它也不起作用。

因此,我将不胜感激!

【问题讨论】:

    标签: tsql northwind


    【解决方案1】:

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

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

    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
    

    【讨论】:

    • 我了解您关于产品名称的解决方案,但我似乎无法使其工作。非常抱歉。你能告诉我你会怎么做吗?
    猜你喜欢
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    相关资源
    最近更新 更多