SQL Aggregate功能通过分区

时间:2018-03-21 22:52:50

标签: sql sql-server window-functions

我对SQL比较新,但已经学到了一些很酷的东西。我得到的结果没有意义。我有一个带有几个子查询的查询,但是我有一个窗口函数,它并不像我期待的那样工作。

不起作用的部分就是这个(从300行查询中简化):

SELECT AVG(table.sales_amount) 
       OVER (PARTITION BY table.month, table.sales_rep, table.department)
FROM table

问题在于,当我拉取非聚合数据时,我得到的值与上面的返回值(95)不同(107)。

我已经为COUNTSUM使用了窗口函数,但它们运行正常,但AVG的行为很奇怪。我错过了一些关于AVG如何使用的内容吗?

table代表的子查询看起来像:

sales_rep,month,department,sales_amount 1, 2017-1, abc, 125.20 1, 2017-2, abc, 120.00 2, 2017-1, def, 100.00 ...etc

使用Sql Server Management Studio

解决:我最终弄明白了,结果我加入这个子查询,让销售代表在一个月内多次销售对象A& B,这导致两个人都被计算两次。哎呀,我的坏。

2 个答案:

答案 0 :(得分:0)

您获得的结果应与以下相同:

SELECT AVG(table.sales_amount) 
FROM table
GROUP BY table.month, table.sales_rep, table.department;

当然,行会有所不同。您需要匹配三个关键列。

根据您的示例数据,分区键看起来像是唯一定义每一行。也许你真的打算:

SELECT AVG(table.sales_amount) OVER () as overall_average
FROM table;

编辑:

对于部门平均值:

SELECT AVG(table.sales_amount) OVER (partition by table.department) as department_average
FROM table;

答案 1 :(得分:0)

在发生一些可能的错误之后,我终于找到了问题。我将该子查询加入到另一个子查询中,该子查询在给定月份内有多个sales_rep实例(销售对象a& b),这导致两个对象销售的平均值被计算两次而不是一次。

所以销售代表1出售了对象a& b使得他的平均数为66%,而不是50%,而销售代表2只占33%。