2016-09-14 96 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 –