2013-03-18 108 views
1

我试图根据销售总额找到前5名销售人员。我想显示代表的名字,以及他们的总销售额,并且我在AdventureWorks工作。前5名销售人员总销售额

不断抛弃我的是GROUP BY声明。在下面的查询中,我不确定为什么GROUP BY无法正常工作。我确信有一个更有效的方法来做到这一点,但在这一点上,我只是试图真正学习连接和子查询,并且GROUP BY工作的方式似乎是我没有抓住的。

SELECT SalesLT.Customer.SalesPerson, SUM(repjoin.TotalDue) OVER (PARTITION BY repjoin.salesperson) 
FROM SalesLT.customer INNER JOIN 
    (SELECT SalesLT.SalesOrderHeader.CustomerID, 
      SalesLT.SalesOrderHeader.TotalDue, 
      SalesLT.Customer.SalesPerson 
    FROM SalesLT.Customer 
     INNER JOIN SalesLT.SalesOrderHeader 
     ON SalesLT.SalesOrderHeader.CustomerID = SalesLT.Customer.CustomerID 
    ) repjoin 
     ON SalesLT.Customer.CustomerID = repjoin.CustomerID 
GROUP BY SalesLT.Customer.SalesPerson 
+0

实际问题是什么?这有帮助吗? http://stackoverflow.com/questions/2404565/sql-server-difference-between-partition-by-and-group-by – RandomUs1r 2013-03-18 22:28:27

+0

欢迎来到堆栈溢出!如果可能,发布问题时,请记住显示您的预期结果以及您收到的结果。 – 2013-03-18 23:55:06

回答

0

为什么不干脆

SELECT TOP 5 
    c.SalesPerson, 
    SUM(soh.TotalDue) TotalSales 
FROM 
    SalesLT.Customer c 
    INNER JOIN SalesLT.SalesOrderHeader soh ON soh.CustomerID = c.CustomerID 
GROUP BY 
    c.SalesPerson 
ORDER BY 
    SUM(soh.TotalDue) DESC 

+0

这应该是你想要的答案。为了解释,“GROUP BY”只是基于指定的值折叠结果。通过'c.SalesPerson'进行分组可以使每个销售人员将结果折叠为一行,从而可以使用集合函数(如SUM(),AVG(),MIN(),MAX()等)在结果中的非分组列上。请注意,只有您分组的列才能被引用,而无需汇总功能。 – 2013-03-18 23:58:25