Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Поиск всех ингредиентов многоступенчатого производства зная только главный продукт
 
Добрый день.
Завис на задаче:

Дан список позиций - продуктов.

И есть огромный справочник состоящий из двух столбцов: продукты (1 столбец) и ингредиенты (2 столбец). Причем ингредиент из 2 столбца может быть в 1 столбце, если у него есть свои ингредиенты. И так до 4-5 ступеней раскладки продукта на ингредиенты.

Нужно вывести список в одном столбце всех ингредиентов всех ступеней зная при этом только список продуктов и в некоторых случаях ингредиент первой ступени который дальше тоже на что-то раскладывается, а на что уже не знаем.

Пример во вложении.
 
kilozaur77, где в примере желаемый результат?
 
Mershik, да, забыл указать.
Список может быть с повторяющимися значениями, в данном примере это Скотч Transp 48/66. Он участвует в двух этапах производства.
 
kilozaur77, не смотерл последний фал - нет времени, сделал на быструю руку так..для одного продукта...
 
Mershik,Спасибо большое, но тут нет дальнейшего расклада следующего этапа, где смесь раскладывается согласно справочника (зеленый цвет). При этом в условии что изначально мы не знаем что такая смесь есть, ее нет в исходных данных.
Итоговый список хочется получить в одном столбце.
 
Рекурсивный макрос сделает это быстро и без напряга. помогал как то делать подобное, но сейчас не могу найти. Формулами будет отвратительно на мой взгляд.
PQ - наверно возможно.
 
Цитата
БМВ написал:
PQ - наверно возможно.
Привет, Михаил.
А почему - наверно? Делался уже обход деревьев на Power Query, и не раз, и рекурсивно и на List.Generate. Скучно повторяться. Можно тоже на SQL сделать (ну. на нормальном, например: SQL Server, Oracle, MySQL)
 
Андрей VG,  Андрей привет. Ну моя нЕлюбовь к PQ известна :-) . Прикинул в уме, что наверно можно но примеров сам не видел, а делать принципиально не хочу. А SQL как бы  поднимать ради рецептуры …. :-)
 
вариант с рекурсией в PQ
Код
let
    Source      = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    RefTbl      = Excel.CurrentWorkbook(){[Name="Справочник"]}[Content],
    Nested      = Table.NestedJoin(Source,"Исходные данные",RefTbl,"Продукт","a"),
    Ingredients = Table.AddColumn(Nested, "Ингредиенты", each
        let x=(arg)=>
            let 
                a= try (if Value.Is(arg,type table) then arg else Table.Combine(List.Select(arg,each Value.Is(_,type table))))[Ингридиент] otherwise {}, 
                b= List.Transform(a,each let a=_, b=Table.SelectRows(RefTbl, each [Продукт]=a) in if Table.RowCount(b)>0 then b else a), 
                c= try List.Select(arg,each not Value.Is(_,type table)) otherwise {} 
            in if List.Count(a)>0 then c&@x(b) else c
        in x([a]))
in
    Table.Group(Table.ExpandListColumn(Ingredients, "Ингредиенты"), {"Исходные данные", "Ингредиенты"}, {{"Количество",Table.RowCount, type number}})
Страницы: 1
Читают тему (гостей: 1)
Наверх