Сгруппированное средневзвешенное значение в запросе Access

#sql #ms-access #average #weighted

#sql #ms-access #среднее #взвешенное

Вопрос:

Я пытаюсь получить средневзвешенную плату в% от продаж для каждого клиента / продукта / города из этих данных. Мне не нужен уровень детализации вспомогательного продукта.

Мои данные выглядят следующим образом:

  -------- --------- ------- -------------- ------- ---------------- 
| Client | Product | City  | Sub Product  | Sales | Fee % of Sales |
 -------- --------- ------- -------------- ------- ---------------- 
| a      | b       | b     | c            |  1000 | 1%             |
| a      | b       | b     | d            |  2000 | 2%             |
| c      | c       | b     | c            |  3000 | 3%             |
| d      | c       | b     | c            |  4000 | 4%             |
 -------- --------- ------- -------------- ------- ---------------- 
  

Я хочу рассчитать средневзвешенную комиссию в%, взимаемую за каждый клиент и комбинацию продуктов. т.е. для клиента 'a' , продукта 'b' , города 'b' : комиссия в% от продаж будет равна (1,000/3,000)*1% (2,000/3000 * 2%)

После того, как я сделаю это, у меня будет другой запрос, который принимает только поле Клиент, продукт, продажи в городе и новое средневзвешенное значение из последнего запроса. Мне нужен другой запрос, потому что я буду использовать результаты как часть более крупного запроса.

Комментарии:

1. мы не решим вашу домашнюю работу. пожалуйста, предоставьте нам доказательства ваших попыток.

Ответ №1:

Это было бы проще сделать с помощью функции window, но поскольку вы используете ms-access… Вы можете вычислить промежуточные итоги продаж для каждого клиента / продукта / города в подзапросе, а затем JOIN использовать исходную таблицу:

 SELECT 
    t.client, t.product, t.city, SUM(t.sales * t.fee / t1.sales) res
FROM 
    mytable t
    INNER JOIN (
        SELECT client, product, city, SUM(sales) sales
        FROM mytable
        GROUP BY client, product, city
    ) t1 
        ON  t1.client = t.client
        AND t1.product = t.product
        AND t1.city = t.city
GROUP BY t.client, t.product, t.city
  

Эта демонстрация в DB Fiddle с вашими образцами данных возвращает:

 | client | product | city | res                             |
| ------ | ------- | ---- | ------------------------------- |
| a      | b       | b    | 0.016666666294137638            |
| c      | c       | b    | 0.029999999329447746            |
| d      | c       | b    | 0.03999999910593033             |
  

Комментарии:

1. Спасибо! Мне потребовалось некоторое время, чтобы расшифровать, поскольку часть синтаксиса в вашем коде не работала, но это работает сейчас!

Ответ №2:

Вы можете вычислить общие значения продаж и комиссионных как часть подзапроса, затем выполнить деление с полученными значениями, например:

 select 
    q.client, 
    q.product, 
    q.city, 
    q.fee/q.totalsales as weightedfee
from
(
    select 
        t.client, 
        t.product, 
        t.city,
        sum(t.sales) as totalsales,
        sum(t.sales*t.[fee % of sales]) as fee
    from yourtable t
    group by t.client, t.product, t.city
) q
  

Измените yourtable в соответствии с вашим именем таблицы.