2016-09-14 89 views
1

我想找到每個員工與大多數收入的產品並列銷售的最頻繁的產品。我寫了一些例子,以便更清楚。選擇最頻繁的值與總和

DECLARE @Products TABLE(ID INT, ProductName NVARCHAR(50), Price DECIMAL) 
DECLARE @Employees TABLE(ID INT, EmployeeName NVARCHAR(50)) 
DECLARE @Sales TABLE(ID INT, EmployeeID INT, ProductID INT, Quantity INT) 

INSERT INTO @Products VALUES 
(1, N'Product1', 300), 
(2, N'Product2', 500), 
(3, N'Product3', 700), 
(4, N'Product4', 800) 

INSERT INTO @Employees VALUES 
(1, N'Employee1'), 
(2, N'Employee2'), 
(3, N'Employee3') 

INSERT INTO @Sales VALUES 
(1,1,2,3), 
(2,1,3,4), 
(3,1,2,5), 
(4,2,2,7), 
(5,2,4,3), 
(6,3,2,3), 
(7,3,2,9), 
(8,3,4,8) 

連接表看起來喜歡這樣的:

enter image description here

我寫了一些選擇

SELECT 
    e.EmployeeName 
    ,p.ProductName 
    ,SUM(s.Quantity) AS Quantity  
    ,p.ProductName 
    ,SUM(s.Quantity * p.Price) AS Price 
FROM @Products p 
    INNER JOIN @Sales s ON s.ProductID = p.ID 
    INNER JOIN @Employees e ON s.EmployeeID = e.ID 
GROUP BY e.EmployeeName, p.ProductName 
ORDER BY SUM(s.Quantity) DESC, SUM(s.Quantity * p.Price) 

返回這個結果,這是不正確的。您注意到價格沒有訂購 enter image description here

我想寫這個格式的選擇,單獨爲每個僱員訂購產品名稱和總量,產品名稱和價格總和。

預期的輸出應該

EmployeeName  ProductName Quantity ProductName  Price 
------------  ----------- -------- -----------  ------ 
Employee3   Product2  12   Product4   6400 
Employee1   Product2  8   Product2   4000  
Employee3   Product4  8   Product2   6000 
Employee2   Product2  7   Product2   3500 
Employee1   Product3  4   Product3   2800 
Employee2   Product4  3   Product4   2400 
+0

我相信,數量和價格進行排序根據您的選擇聲明。首先按數量遞減,然後按價格遞增排序。 – NickyvV

+0

請發佈預期的輸出以及 – Susang

+0

@NickyvV是的但價格不是訂購升序 – www1986

回答

0

您所查詢的是開始。然後你可以使用窗口函數和條件彙總:

SELECT EmployeeName, 
     MAX(CASE WHEN seqnum_q = 1 THEN ProductName END) as productname_q, 
     MAX(CASE WHEN seqnum_q = 1 THEN Quantity END) as quantity_q, 
     MAX(CASE WHEN seqnum_pq = 1 THEN ProductName END) as productname_pq, 
     MAX(CASE WHEN seqnum_pq = 1 THEN Quantity END) as quantity_pq 
FROM (SELECT e.EmployeeName, p.ProductName, 
      SUM(s.Quantity) AS Quantity, SUM(s.Quantity * p.Price) AS Price, 
      ROW_NUMBER() OVER (PARTITION BY e.EmployeeName 
           ORDER BY SUM(s.Quantity) DESC 
           ) as seqnum_q, 
      ROW_NUMBER() OVER (PARTITION BY e.EmployeeName 
           ORDER BY SUM(s.Quantity * p.Price) DESC 
           ) as seqnum_pq 
     FROM @Products p INNER JOIN 
      @Sales s 
      ON s.ProductID = p.ID INNER JOIN 
      @Employees e 
      ON s.EmployeeID = e.ID 
     GROUP BY e.EmployeeName, p.ProductName 
    ) ep 
GROUP BY EmployeeName; 
+0

這個查詢返回只有3行 – www1986

+0

@ www1986。 。 。我看到你編輯了這個問題來提供示例輸出。這爲每個員工返回一行,這似乎更符合原始問題的精神。 –

0

更改您的訂單通過爲:

ORDER BY SUM(s.Quantity) DESC, SUM(s.Quantity * p.Price) Desc 
+0

仍然是同樣的問題 – www1986

0

試試這個:

SELECT 
    e.EmployeeName 
    ,p.ProductName 
    ,SUM(s.Quantity) AS Quantity  
    ,p.ProductName 
    ,SUM(s.Quantity * p.Price) AS Price 
FROM @Sales s 
    INNER JOIN @Products p ON s.ProductID = p.ID 
    INNER JOIN @Employees e ON s.EmployeeID = e.ID 

GROUP BY e.EmployeeName, p.ProductName 
ORDER BY e.EmployeeName, SUM(s.Quantity) DESC, SUM(s.Quantity * p.Price),p.ProductName 
+0

請更改FROM子句以糾正錯誤,以便它可執行 – Susang

+0

@ suraz錯誤對不起,我正在測試幾個方案並忘記銷售後的產品s –