我对SQL比较新,但已经学到了一些很酷的东西。我得到的结果没有意义。我有一个带有几个子查询的查询,但是我有一个窗口函数,它并不像我期待的那样工作。
不起作用的部分就是这个(从300行查询中简化):
SELECT AVG(table.sales_amount)
OVER (PARTITION BY table.month, table.sales_rep, table.department)
FROM table
问题在于,当我拉取非聚合数据时,我得到的值与上面的返回值(95)不同(107)。
我已经为COUNT
和SUM
使用了窗口函数,但它们运行正常,但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,这导致两个人都被计算两次。哎呀,我的坏。
答案 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%。