【问题标题】:Top 5 Sales people with their total sales总销售额排名前 5 的销售人员
【发布时间】:2013-03-18 22:18:16
【问题描述】:

我试图根据总销售额找出前 5 名销售人员。我想显示销售代表的姓名和他们的总销售额,我在 AdventureWorks 工作。

让我失望的是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

【问题讨论】:

  • 真正的问题是什么?这有帮助吗? stackoverflow.com/questions/2404565/…
  • 欢迎来到 Stack Overflow!在发布问题时,请记住尽可能展示您的预期结果以及您获得的结果。

标签: sql join group-by subquery


【解决方案1】:

为什么不简单

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

?

【讨论】:

  • 这应该是你想要的答案。解释一下,GROUP BY 只是根据指定的值折叠结果。按c.SalesPerson 分组会将结果折叠到每个销售人员一行,从而允许您对结果中的非分组列使用聚合函数(例如SUM()、AVG()、MIN()、MAX() 等)。请注意,只有您分组的列才能在没有聚合函数的情况下被引用。
猜你喜欢
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-18
  • 1970-01-01
  • 1970-01-01
  • 2013-11-24
  • 1970-01-01
相关资源
最近更新 更多