2016-05-11 10 views
0

私は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人の従業員を持っていると私はそのためのトップの機能を使用しますが、従業員は一意ではありません。

だから私は手に感謝します!

答えて

0

あなたの問題は、製品名でグループ化することです。したがって、従業員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 
+0

私はproductnameについてあなたの解決策を理解していますが、動作させるように見えません。ひどくすみません。どうやってやろうか教えてくれますか? –

+0

ありがとう –

関連する問題