Использование группировки по иерархическим столбцам в SQL - PullRequest
0 голосов
/ 21 июня 2020

У нас есть набор данных, случайная выборка показана ниже;

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

Я вижу разницу в ответах. И мне очень хочется понять, в чем причина этой разницы root, а во-вторых, какие факторы следует тщательно учитывать при использовании предложения Group By. Это поможет мне избежать слепого использования предложения Group By в будущем. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 21 июня 2020

Первый вычисляет средние продажи для каждого города в данных. Каковы средние продажи в городе для среднего продавца в среднем за день?

Второй вычисляет средние продажи из всего для каждого продавца в городе. Каковы средние продажи в городе для продавца за все дни ?

Это совершенно разные вещи. Нет причин ожидать, что они будут даже близко.

0 голосов
/ 21 июня 2020

В вашем первом построении вы вычисляете среднюю сумму продажи в каждом городе, независимо от продавца. Во втором случае вы вычисляете сумму для каждого продавца в каждом городе , а затем берете среднее значение , которое для каждого города.

Представьте, что продавец A делает 99 продаж по 1 доллару каждая, и продавец Б совершает 1 продажу по 1 доллару. В вашем первом построении среднее значение составит 1 доллар США. Во втором случае у продавца A всего 99 долларов, а у продавца B - 1 доллар, что в среднем составляет 49,50 долларов. ; это лог c за вашим расчетом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...