Вычисление средневзвешенного значения для неструктурированных данных по формуле массива в Excel - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь вычислить средневзвешенное значение в Excel для неструктурированных данных и остаюсь компактным (без добавления справочной таблицы для работы). Данные структурированы следующим образом, и я не могу их изменить.

Data structure example

Я уверен, что объем (весовой коэффициент) всегда будет раньше в наборе данных, чем цена (значение к среднему). Я также уверен, что данные отсортированы, как показано на рисунке

Как вы думаете, есть способ рассчитать средневзвешенное значение для одного продукта в одной строке? Я уже пробовал формулы массива, но не могу сопоставить значения, которые должны быть умножены в массивах: объемы с ценами.

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

product;customer;parameter;Jan;Feb;Mar
product 1;customer 1;volume;69;75;98
product 1;customer 1;price;97;32;96
product 1;customer 1;other parameter;71;31;50
product 1;customer 1;other parameter;2;1;79
product 1;customer 1;other parameter;74;93;67
product 1;customer 2;volume;59;74;94
product 1;customer 2;other parameter;0;73;67
product 1;customer 2;price;40;38;89
product 1;customer 2;other parameter;29;44;86
product 1;customer 3;other parameter;85;30;7
product 1;customer 3;volume;34;72;7
product 1;customer 3;price;35;46;33
product 2;customer 4;volume;87;81;64
product 2;customer 4;price;21;65;94
product 2;customer 4;other parameter;78;68;36
product 2;customer 4;other parameter;33;27;47
product 2;customer 4;other parameter;66;57;53
product 2;customer 1;volume;42;70;22
product 2;customer 1;other parameter;7;88;21
product 2;customer 1;price;43;58;80
product 2;customer 1;other parameter;27;51;48

product 1;;weighted-average price;63.2283950617284;38.5701357466063;90.4773869346734
product 2;;weighted-average price;28.1627906976744;61.7549668874172;90.4186046511628

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Введите как формулу массива в D24 и заполните / уменьшите:

=SUM(SUMIFS(D$2:D$22,$A$2:$A$22,$A24,$B$2:$B$22,IF(($A$2:$A$22=$A24)+($C$2:$C$22="price")=2,$B$2:$B$22),$C$2:$C$22,"volume")*IF(($A$2:$A$22=$A24)+($C$2:$C$22="price")=2,D$2:D$22))/SUMIFS(D$2:D$22,$A$2:$A$22,$A24,$C$2:$C$22,"volume")

Предполагается, что данные содержат только одну запись объема / цены на одного клиента в месяц.

0 голосов
/ 28 июня 2018

Вы можете использовать Power Query (Получить и преобразовать данные):

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed type" = Table.TransformColumnTypes(Source,{{"product", type text}, {"customer", type text}, {"parameter", type text}, {"Jan", type number}, {"Feb", type number}, {"Mar", type number}}),
    #"Filtered volume price" = Table.SelectRows(#"Changed type", each ([parameter] = "volume" or [parameter] = "price")),
    #"Unpivoted months" = Table.UnpivotOtherColumns(#"Filtered volume price", {"product", "customer", "parameter"}, "month", "value"),
    #"Pivoted parameter" = Table.Pivot(#"Unpivoted months", List.Distinct(#"Unpivoted months"[parameter]), "parameter", "value", List.Sum),
    #"Added revenue" = Table.AddColumn(#"Pivoted parameter", "revenue", each [volume] * [price]),
    #"Grouped products months" = Table.Group(#"Added revenue", {"product", "month"}, {{"total revenue", each List.Sum([revenue]), type number}, {"total volume", each List.Sum([volume]), type number}}),
    #"Added average price" = Table.AddColumn(#"Grouped products months", "average price", each [total revenue] / [total volume]),
    #"Removed totals" = Table.RemoveColumns(#"Added average price",{"total revenue", "total volume"}),
    #"Pivoted months" = Table.Pivot(#"Removed totals", List.Distinct(#"Removed totals"[month]), "month", "average price", List.Sum),
    #"Reordered months" = Table.ReorderColumns(#"Pivoted months",{"product", "Jan", "Feb", "Mar"})
in
    #"Reordered months"

Более изощренный подход - пропустить последние две строки и загрузить запрос в модель данных - тогда вы можете использовать формулы CUBEVALUE для получения средних цен:

=CUBEVALUE("ThisWorkbookDataModel",
 CUBEMEMBER("ThisWorkbookDataModel","[Measures].[Sum of average price]"),
 CUBEMEMBER("ThisWorkbookDataModel","[Table1].[product].&["&$A24&"]"),
 CUBEMEMBER("ThisWorkbookDataModel","[Table1].[month].&["&D$1&"]"))
...