Страницы: 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
Наверх