#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
в соответствии с вашим именем таблицы.