Страницы: 1
RSS
Выборка из таблиц до последнего null, Power Query
 
Добрый день.
Решаю задачу, которая требует дублирования запроса power query для создания нового уровня и так дублировать запрос можно до 8 раз с увеличением шагов в каждом из них.
Услофия формирования
Существует 5 таблиц.
Где таблица1 - Начальные данные, по которым и производиться расчет;
таблица 2 - владелец и его спецификация,
таблица 3 - спецификация и ее номенклатура,
таблица 4 - владелец он же номенклатура со специкацией, где наличие индекса, говорит, о необходимости анализа на новом уровне (другими словами, этот владелец состоит из несколькоих номенклатур),
таблица 5 - таблица с ценами на номенклатуру, используется в конце, при расчете всех выпущенных номенклатур.

Финальный результат не точный, т.к. в реальности количество уровней достигает 8 и каждый раз приходится копировать последний запрос и продолжать делать из него, что бы потом это все склеить в одну длинную таблицу.
Возможно мне кто-то подскажет как это все вместить более компактно в квери. Понимаю, что задача скомкана и сам ее с трудом понимаю, требовалось больше месяца, что бы понять принцип формирования таблиц, но я сделал сами запросы в файле, и именно по такому принципу и делаются шаги, это самое главное.
 
bereteli, чисто из интереса. Если добавится уровень, какие будут изменения в конечной таблице и в пяти исходных таблицах?
Можете это показать в отдельном файле
 
Михаил Л, Насколько мне известно, больше 8 уровней не будет. У себя столько и накрутил. Но у меня это на 25 товаров. Думаю, если будет 10000 товаров в таблице 1, то квери загнётся лопатить одно и тоже 8 раз, а потом это ещё и соединять
Изменено: bereteli - 19.04.2020 15:03:29
 
bereteli, наверное вы правы
 
как-то так
Код
let
    fn=(t) => 
        let
            Source = Table.RenameColumns(t[[Номенклатура],[Путь],[Уровень]],{"Номенклатура","Владелец/номенклатура"}),
            Nested = List.Accumulate(Table.ToRows(Config),Source,(a,b)=>
                         Table.ExpandTableColumn(Table.NestedJoin(a,b{1},b{0},if b{2}="" then b{1} else b{2},"a"),"a",{b{3}})
                     ),
            Filter = Table.SelectRows(Nested ,each [Номенклатура]<>null),
            Path   = Table.ReplaceValue(Filter,each [Номенклатура],null,(a,b,c)=>a&"_"&b,{"Путь"}),
            Inc    = Table.TransformColumns(Path,{{"Уровень",each _+1}})
        in Inc,
    Source  = Table.AddColumn(Table.DuplicateColumn(Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],"Номенклатура","Путь"),"Уровень",each 1),
    Config  = Table.Buffer(Table.FromRows({
                  {Table.Buffer(Влад_ном_спец),"Владелец/номенклатура","","Спецификация"},
                  {Table.Buffer(Спец_ном),"Спецификация","","Номенклатура"},
                  {Table.Buffer(Влад_спец_индекс),"Номенклатура","Владелец","Индекс"},
                  {Table.Buffer(Цена),"Номенклатура","","Цена"}
              })),
    Generate  = Table.Combine(List.Generate(()=>Source,each List.NonNullCount([Номенклатура])>0,each fn(_))),
    Reorder = Table.ReorderColumns(Generate,{"Владелец/номенклатура", "Спецификация", "Номенклатура","Путь","Уровень"})    
in
    Reorder
 
Андрей Лящук, Вау. Это очень круто!!! Спасибо вам. Теперь буду сидеть изучать принцип работы. Потому что для меня это сложноватый код, но будет куда расти. Как я понимаю в реальной моей модели он тоже остановится на последнем нуле, даже если это будет 8 уровень?
 
Андрей Лящук, а можно попроще разложить? :)
Подлиннее  и попонятнее бы чтоб разобрать смочь
 
Михаил Л, мне бы тоже хотелось бы, но как-то стесняюсь просить. Человек итак нереальную для меня штуку создал
 
Цитата
bereteli написал:
Насколько мне известно, больше 8 уровней не будет. У себя столько и накрутил. Но у меня это на 25 товаров
А этот файл с товарами и вашим запросом можете на форум выложить? Ссылкой с облака, например
 
Михаил Л, Это коммерческая информация. Я пока это выкрутил в задание сам устал
 
Цитата
bereteli написал:
Это коммерческая информация
Да не, покупать я не буду. Не тот форум)
 
Код
let
    fn=(t) => 
        let
            Source = Table.RenameColumns(t[[Номенклатура],[Путь],[Уровень]],{"Номенклатура","Владелец/номенклатура"}),

            Nested1 = Table.NestedJoin(Source,"Владелец/номенклатура", Source1, "Владелец/номенклатура" ,"a"),
            Expand1 = Table.ExpandTableColumn(Nested1, "a", {"Спецификация"}),
            
            Nested2 = Table.NestedJoin(Expand1,"Спецификация", Source2, "Спецификация" ,"a"),
            Expand2 = Table.ExpandTableColumn(Nested2, "a", {"Номенклатура"}),
            
            Nested3 = Table.NestedJoin(Expand2,"Номенклатура", Source3, "Владелец" ,"a"),
            Expand3 = Table.ExpandTableColumn(Nested3, "a", {"Индекс"}),
            
            Nested4 = Table.NestedJoin(Expand3,"Номенклатура", Source4, "Номенклатура" ,"a"),
            Expand4 = Table.ExpandTableColumn(Nested4, "a", {"Цена"}),
            
            Filter = Table.SelectRows(Expand4 ,each [Номенклатура]<>null),
            Path   = Table.ReplaceValue(Filter,each [Номенклатура],null,(a,b,c)=>a&"_"&b,{"Путь"}),
            Inc    = Table.TransformColumns(Path,{{"Уровень",each _+1}})

        in Inc,
    Source  = Table.AddColumn(Table.DuplicateColumn(Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],"Номенклатура","Путь"),"Уровень",each 1),
    
    Source1 = Table.Buffer(Влад_ном_спец),
    Source2 = Table.Buffer(Спец_ном),
    Source3 = Table.Buffer(Влад_спец_индекс),
    Source4 = Table.Buffer(Цена),

    Generate  = Table.Combine(
      List.Generate(                                 /*формируем список таблиц, каждая таблица - один уровень*/
          ()=>Source,                                /*начальное значение - уровень1, сформированный в Source*/
          each List.NonNullCount([Номенклатура])>0,  /*условие формирования элементов массива - 
                                                       в столбце Номенклатура должно быть хотя бы 1 не null значение*/
          each fn(_)                                 /*пока выполняется условие, продолжаем формировать элементы
                                                       списка, передавая в функцию fn предыдущую сформированную таблицу
                                                       таблицы, не прошедшие проверку в выдачу не попадают*/
      )
  ),
    Reorder = Table.ReorderColumns(Generate,{"Владелец/номенклатура", "Спецификация", "Номенклатура","Путь","Уровень"})    
in
    Reorder
 
Андрей Лящук, Спасибо вам за помощь. Огромная благодарность, но можно пару слов чем, коды отличаются? Лучше мне для лично своей задачи использовать второй код? Т.к. Я сам до конца не знаю, сколько уровней они могут сделать.
 
bereteli, это тот же код, расписанный несколько подробнее
 
Цитата
Андрей Лящук написал:
код, расписанный несколько подробнее
Спасибо большое
 
Цитата
Михаил Л написал:
Если добавится уровень, какие будут изменения в конечной таблице и в пяти исходных таблицах?
Цитата
bereteli написал:
больше 8 уровней не будет. У себя столько и накрутил. Но у меня это на 25 товаров.
Андрей Лящук, как не пытаюсь изменить данные в таблицах, все равно число уровней не увеличивается. Что надо изменить чтобы эта формула выдала больше трех таблиц в списке?
Извините что уже и по таким вопросам обращаюсь
Код
= List.Generate(                                 
          ()=>Source,                                
           each List.NonNullCount([Номенклатура])>0,   
           each fn(_))
 
Михаил Л, не знаю, делаете вы по моему примеру или нет, но если по моему, то что бы появился новый уровень нужно, что бы номенклатура появилась в таблице 4, а сам товар должен быть к ней подвязан.  
 
Цитата
bereteli написал:
что бы появился новый уровень нужно, что бы номенклатура появилась в таблице 4
В таблице нет заголовка номенклатура, но все равно добавил четвертую строку со значениями:  З  8   4 .
Цитата
bereteli написал:
а сам товар должен быть к ней подвязан
Как это сделать? В какую таблицу что еще добавить?
 
Андрей Лящук, подскажите пожалуйста, а то делать, если запрос выдает
Код
Expression.Error: При вычислении возникло переполнение стека. Продолжение невозможно.
 
Михаил Л,  как-то так
Изменено: Андрей Лящук - 20.04.2020 11:45:17
 
bereteli, видимо у вас в таблице циклические связи
 
Андрей Лящук, просто у меня в оригинальной таблице 25 товаров. И еще в моем случае таблица 2 это и есть таблица 4. Но я как бы просто продублировал запрос и немного его изменил, как вы написали. мне нужно переделать этот шаг?
 
Цитата
Андрей Лящук написал:
как-то так
Понял. Спасибо. Думал я что это проще делается)
 
Андрей Лящук, Спасибо Вам огромное, закинул в Bi и оно просто улетело. 1400 строк за пол минуты и 8 уровней. Огромное спасибо. Очень хотелось бы достичь уровня ваших знаний. Может что-то порекомендуете на чтение-изучение.
Страницы: 1
Наверх