对sql中的层次结构列使用group by

u4vypkhs  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(447)

我们有一个数据集,随机样本如下所示;

city|salesman_id|day|sale_qty

Chicago| 1  | 2017-01-16 | 24
Chicago| 1  | 2017-01-17 | 23
Chicago| 2  | 2017-01-16 | 20
NewYork| 1  | 2017-01-15 | 0
NewYork| 2  | 2017-01-15 | 10
NewYork| 1  | 2017-01-16 | 5

在这里,我们确信 salesman_id 以及 day 是独一无二的。例如, salesman_id =1 以及 day=2017-01-17 不能出现两次或多次。
现在的问题是,对于每个城市,找出平均销售量。我的第一次尝试是;

SELECT city,
       AVG(sale_qty)
FROM table
GROUP BY city

第一种方法给出的答案是:;

City|avg_sales

 Chicago| 22.33
 NewYork| 5

作为一种直觉,我尝试了另一种方法;

WITH CTE1(

SELECT city,
        salesman_id,
        SUM(sale_qty) AS total
FROM table
GROUP BY city, salesman_id)

SELECT city,
      AVG(total)
FROM CTE1
GROUP BY city

这就给出了答案;

city| avg_sales

Chicago| 33.5
NewYork| 7.5

我能看出答案的不同。而我真的很想明白,造成这种差异的根本原因是什么,其次,在使用时应该仔细考虑哪些因素 Group By 条款。这将帮助我避免使用 Group By 在将来盲目的条款。提前谢谢。

uajslkp6

uajslkp61#

第一种方法计算数据中每个城市的平均销售额。一个普通销售人员平均一天的平均销售额是多少?
第二种方法计算城市中每个销售人员的平均销售额。一个销售员一整天在这个城市的平均销售额是多少?
这些是完全不同的。没有理由指望他们会在一起。

j8ag8udp

j8ag8udp2#

在第一个构建中,您计算每个城市的平均销售金额,而不考虑销售人员。在第二种情况下,计算每个城市每个销售人员的总和,然后取每个城市的平均值。
试想一下,销售员a每人赚99美元,销售员b每人赚1美元。在你的第一个建筑中,平均值是1美元。在你的第二个例子中,销售员a总共99美元,销售员b总共1美元,平均49.50美元。
问题与sql无关,特别是group-by;这就是你计算的逻辑。

相关问题