解释为什么我的查询使用窗口函数计数时会引起错误,排名(按分区)?

问题描述 投票:0回答:1
我将感谢任何解释和链接到资源的链接,以解释为什么发生错误的原因。 我正在研究T-SQL。我使用AdventureWorks数据库。 Microsoft SQL Server开发人员16.0.1000.6

我的任务: 编写一个根据分配给客户的订单数量对销售人员进行排名的查询。 我的查询:

select C.SalesPerson, count(SOH.SalesOrderID) over (partition by C.SalesPerson) as SalesCount, rank() over (order by count(SOH.SalesOrderID)) as [Rank] from SalesLT.Customer as C inner join SalesLT.SalesOrderHeader as SOH on C.CustomerID = SOH.CustomerID group by C.SalesPerson order by rank;

eRr: 列saleslt.salesorder.salesorderID'在选择列表中无效,因为它不包含在汇总函数中或组中的组中。

为什么出现错误?

为什么不能在这条代码中使用
分区。

count(SOH.SalesOrderID) over (partition by C.SalesPerson) as SalesCount,

  1. SalesCount
    中,您要求它做一个非零值的窗口计数。但是窗口功能是执行
    后分组和正常聚合,因此不再存在
  2. SalesOrderID
列。 sql执行的逻辑顺序是:
sql-server database t-sql
1个回答
1
投票

SalesOrderID
/
FROM
/JOIN

APPLY

  • WHERE
    
    
    GROUP BY
    
    
  • HAVING
    (窗口函数)
  • OVER
    
    
  • SELECT
    
    
  • DISTINCT
    /
    TOP
  • 理论上您可以使用:
  • OFFSET
  • 其他单词:要求
    批量计数,然后进行窗口的总和。
  • 但是这样做毫无意义,因为无论如何您都通过
  • sum(count(SOH.SalesOrderID)) over (partition by C.SalesPerson) as SalesCount,
    分组,因此该分区始终是一行。所以你最好只是做
    C.SalesPerson
  • 同样,
count(SOH.SalesOrderID) as SalesCount,

可能不是无效的,所以要做的是同一件事

SalesOrderID
to也同样的是

count(*) as SalesCount, 因此,您的查询可以简化为 order by rank


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.