Добрый день, друзья. Столкнулся с задачей решить которую у меня не получается. В Power Pivot мне нужно настроить меру, которая бы отображала количество торговых точек в которое било отгружено определенное количество СКЮ.
Во вложении упрощенный пример массива. Также мера должна еще реагировать на фильтры если они будут применяться (например дистрибьютор, регион, месяц, группа товара и т.д.).
Доброе время суток. На основании какого рассуждения по исходным данным для чая (6 раз упомянут) получилось 3 ТТ, а для конфет (5 раз упомянуты) получилось тоже 3?
Добрый день, Андрей VG. Данные в таблице отображены в качестве примера того в каком виде хотелось бы получить результат. Цифры сге нерированы случайным образом и не связаны какой-либо логикой с массивом в примере.
Для большей наглядности вручную заполнил сведенную таблицу (во вложении). Цветами отметил торговые точки, которые попадают в ту или иную группу. Например: в ТТ4, ТТ5 и ТТ7 в течении месяца было отгружено по 1 СКЮ, соответственно в итоговой таблице указано, что по одному СКЮ было отгружено в три торговые точки.
Решение с доп. столбцом и отбором уникальных SKU Формула для доп. столбца: =ЕСЛИ(СЧЁТЕСЛИ($C$2:C2;C2)=1;СУММ(--ЕЧИСЛО(ПОИСКПОЗ(SKU;ЕСЛИ($C$2:$C$23=C2;$D$2:$D$23);0)));"")
Vadim_V, если я правильно понял ваш алгоритм, то вот решение... У меня нет Power Pivot, сделал в экселе.
Код
let
Data = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
KSUCounts = List.Transform
(
List.Distinct(Data[Название ТТ]),
(Item) =>
List.Count
(
// Уберите вызов List.Distinct если в учете количества надо учитывать дубликаты СКЮ,
// Сейчас "Конфеты" и "Конфеты" для одной и той же ТТ считаются как 1 вхождение.
List.Distinct
(
Table.SelectRows(Data, each [Название ТТ] = Item)[СКЮ]
)
)
),
Recs = List.Transform
(
List.Sort(List.Distinct(KSUCounts), Order.Ascending),
(Item) => [
SKU_Count = Item,
Shops = List.Count(List.Select(KSUCounts, each _ = Item))
]
)
in
Table.FromRecords(Recs)
А доказательства? Создадим тестовую таблицу 1000000 строк. Столбец "Название ТТ" заполним СЛУЧМЕЖДУ(1;200000), а "СКЮ" СЛУЧМЕЖДУ(1;20000). В среднем столбец "Название ТТ" будет содержать 200000 уникальных значений. Первый ваш шаг KSUCount будет 200000 раз фильтровать исходную таблицу по миллиону записей в каждой итого 2*10^5 * 1*10^6 = 2*10^11 операций, дальше можно не считать Предложенный мной подход 1. Table.Distinct по двум столбцам в худшем случае 1000000 уникальных значений. С использованием словаря сложность 1000000*Log(1000000;2) = 19931568 2. Традиционный для группировки с созданием словаря сложность 1000000*Log(200000;2) = 17609640. 3. Думаю понятно, что вторую группировку можно и не учитывать. 4. Складываем 1 и 2, получаем 3,75*10^7. Вывод ваш алгоритм на миллионе строк уже в 5000 раз медленнее. Тестирование на созданной таблице это показало. Предложенный мной отработал за 12 секунд. Завершения выполнения вашего не дождался (сходил на перекур, но запрос даже не начал вывод).