Страницы: 1
RSS
Вычисление количества торговых точек по количеству отгруженных СКЮ
 
Добрый день, друзья.
Столкнулся с задачей решить которую у меня не получается.
В Power Pivot мне нужно настроить меру, которая бы отображала количество торговых точек в которое било отгружено определенное количество СКЮ.

Во вложении упрощенный пример массива.
Также мера должна еще реагировать на фильтры если они будут применяться (например дистрибьютор, регион, месяц, группа товара и т.д.).


Результат должен выглядеть примерно так:
Количество   СКЮКоличество ТТ
12
25
34
46
53
63
Изменено: Vadim_v - 08.01.2019 17:38:40
 
Доброе время суток.
На основании какого рассуждения по исходным данным для чая (6 раз упомянут) получилось 3 ТТ, а для конфет (5 раз упомянуты) получилось тоже 3?
 
Добрый день, Андрей VG. Данные в таблице отображены в качестве примера того в каком виде хотелось бы получить результат. Цифры сге
нерированы случайным образом и не связаны какой-либо логикой с массивом в примере.
 
Для большей наглядности вручную заполнил сведенную таблицу (во вложении). Цветами отметил торговые точки, которые попадают в ту или иную группу.
Например: в ТТ4, ТТ5 и ТТ7 в течении месяца было отгружено по 1 СКЮ, соответственно в итоговой таблице указано, что по одному СКЮ было отгружено в три торговые точки.
Количество   СКЮКоличество ТТ
13
 
Решение с доп. столбцом и отбором уникальных SKU
Формула для доп. столбца:
=ЕСЛИ(СЧЁТЕСЛИ($C$2:C2;C2)=1;СУММ(--ЕЧИСЛО(ПОИСКПОЗ(SKU;ЕСЛИ($C$2:$C$23=C2;$D$2:$D$23);0)));"")
Если в мире всё бессмысленно, — сказала Алиса, — что мешает выдумать какой-нибудь смысл? ©Льюис Кэрролл
 
Версия Power Pivot 2010
Цитата
Vadim_v написал:
Для большей наглядности вручную заполнил сведенную таблицу
Это надо было сделать в первом посте ;)  Попробуйте понять, читая только первый пост, что хотел получить ТС.
 
Андрей VG, спасибо. Вы мне очень помогли. Сейчас буду пробовать прописать вашу меру в полном массиве.
Еще раз огромное спасибо.)

P.S. Касательно более детального описания в первом посте учту и исправлюсь. )))
 
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)
Изменено: Alexey_Spb - 10.01.2019 14:56:06
 
Цитата
Alexey_Spb написал:
то вот решение
Алексей, я понимаю, что вы тренируетесь в углубленном изучении языка. Но зачем же так!?
Код
let
    Source = Excel.CurrentWorkbook(){[Name="База"]}[Таблица1],
    #"Removed Duplicates" = Table.Distinct(Source, {"Название ТТ", "СКЮ"}),
    #"Grouped Rows" = Table.Group(#"Removed Duplicates", {"Название ТТ"}, {{"Количество СКЮ", each Table.RowCount(_), type number}}),
    #"Grouped Rows1" = Table.Group(#"Grouped Rows", {"Количество СКЮ"}, {{"Количество ТТ", each Table.RowCount(_), type number}})
in
    #"Grouped Rows1"
 
Alexey_Spb, Андрей VG, спасибо. ))
 
Андрей VG, причем здесь тренировки?

У вас свой вариант решения, у меня свой - ничем не хуже (и не лучше) вашего.
Код
let
    Data = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    KSUCounts = List.Transform(List.Distinct(Data[Название ТТ]), (Item) => List.Count(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)
Изменено: Alexey_Spb - 10.01.2019 15:13:12
 
Цитата
Alexey_Spb написал:
ничем не хуже
А доказательства?
Создадим тестовую таблицу 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 секунд. Завершения выполнения вашего не дождался (сходил на перекур, но запрос даже не начал вывод).
Изменено: Андрей VG - 10.01.2019 16:32:34
 
Андрей VG, спасибо за информацию.

Ваш способ действительно принципиально быстрее. Для меня это стало поводом задуматься о производительности моих запросов на больших массивах данных.
Изменено: Alexey_Spb - 10.01.2019 17:47:57
Страницы: 1
Наверх