Страницы: 1
RSS
PQ. Возврат значения строки таблицы-фрагмента по условию
 
Добрый день!
Прошу помощи в решении очередной задачи.
С помощью группировки сворачиваю строки, в каждой вложенной таблице-фрагменте может быть от одной до нескольких строк.
Как по условию возвращать из таких таблиц-фрагментов только одну строку?

Реально такое в PQ сделать? С условиями немного знаком, но не сталкивался с их использованием в таблицах-фрагментах.
Изменено: jeka-irbis - 05.03.2020 13:48:38
 
Цитата
jeka-irbis написал:
Реально такое в PQ сделать?
Нет, он с картинками не работает. Вот если бы был файл с табличками, то можно было бы подумать.
Вот горшок пустой, он предмет простой...
 
PooHkrd, при чем тут картинки? Это визуализация примера.
Если вы имеете ввиду, что нужно "тело"... Excel-евский файл с исходными данными загрузить не могу - большой и имеющий конфиденциальные сведения((
 
Ваш
Цитата
jeka-irbis написал:
файл с исходными данными
тут на фиг никому не сдался. Нужен файл-пример, максимально полно отображающий структуру ваших данных с десятком-другим строк вымышленных значений. На которых возможно воспроизвести интересующую вас задачу. Если это так трудно, значит вот так вам нужно решение.
Вот горшок пустой, он предмет простой...
 
Добавил пример в #1, насколько возможно обезличив)

Цитата
PooHkrd написал:
Если это так трудно, значит вот так вам нужно решение.
Решение очень нужно, так что не ругайтесь) Пример вроде получился понятным. На всякий случай - продублирую в это сообщение тоже:
 
Доброе время суток
Цитата
jeka-irbis написал:
очень нужно,
Не чувствуется. Сначала вас надо файл уговорить выложить, теперь ещё внятный пример вывода показать... :)
Вариант - насколько хватило моих телепатических способностей.
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Вариант_6"]}[Content],
    grouped = Table.Group(Source, {"ЧЕРТЕЖ"}, {{"Количество", each Table.RowCount(_), Int64.Type}, {"Первая папка", each [ПАПКА]{0}?, Text.Type}})
in
    grouped
 
Андрей VG, телепатические способности, конечно, у вас... Мало что понятно непрофи, но почти то, что надо, спасибо!

Только нужно оставить столбец "Папка с листами" - если бы этого не требовалось, я бы не писал запрос в PQ)) Можно как-то внедрить ваш код в запрос примера?
 
Цитата
jeka-irbis написал:
нужно оставить столбец "Папка с листами"
Цитата
Андрей VG написал:
теперь ещё внятный пример вывода показать...
 
Андрей VG, оказалось, проще решить задачу самостоятельно. Хоть и 35 действий, зато свое, логика понятна)

Спасибо!
 
Цитата
jeka-irbis написал:
Спасибо!
Да не за что - сами же сделали. Успехов!
Цитата
jeka-irbis написал:
Хоть и 35 действий, зато свое, логика понятна)
и двое суток возиться - лишь пример не делать ;)  В прочем, если собственное ковыряние на пользу себе любимому, то так и стоит делать.
Только пример решения не забывайте выкладывать - форум всё же.
Изменено: Андрей VG - 06.03.2020 18:02:48
 
Цитата
Андрей VG написал: Да не за что - сами же сделали. Успехов!

Ну почему же - дали понять, что мой пример непонятен, а пока я его пытался сделать "более внятным" - пришла идея, как сделать самому. За сутки (не двое    :) ) справился - куда на работе торопиться-то))
Идея в том, чтобы ввести индексацию и количества строк в таблицах-фрагментах, чтобы нужные строки всегда становилась первыми, а потом при разворачивании удалить дубликаты. Наверняка, есть более изящный способ, но пока умею так...


Судя по тому, что выложенный пример был не понят - имеет ли смысл готовое решение?) Хотя - мне не жалко (запрос "не причесывался"):
Изменено: jeka-irbis - 06.03.2020 19:15:21
 
чего-то я не обнаружил запрос в файле
Код
let
    Source = Excel.CurrentWorkbook(){[Name="ИсходныеДанные"]}[Content],
    Group = Table.Group(Source, {"Изометричка", "КОМПЛЕКТ"}, {{"a", each [КОМПЛЕКТ]{0} & " (" & Text.Combine(List.Transform([#"Л."],Text.From),", ") &")"},{"b" , each List.Sum([Масса])}}),
    Group1 = Table.Group(Group, {"Изометричка"}, {{"Исходный комплект", each [КОМПЛЕКТ]{0}},{"Ссылки на РД",each Text.Combine([a],"; ")},{"Масса Трубопровода", each List.Sum([b])},{"Модель копирования", each [КОМПЛЕКТ]{0}}})
in
    Group1
 
Андрей Лящук,  8-0  /в шоке/ Пока за гранью понимания, как...
Хотя не идеально... Могут простакивать неправильные значения в "Модель копирования", строка 46.
Нужна сортировка комплектов по количеству листов, чтобы комплект с бОльшим количеством шел первым, тогда в "Модель копирования" попадет нужное (как я понимаю, извлекается первое значение из списка)

С запросом в моем файле какая-то лажа вышла, сейчас перезалью:
Изменено: jeka-irbis - 06.03.2020 22:45:28
 
Код
let
    Source = Excel.CurrentWorkbook(){[Name="ИсходныеДанные"]}[Content],
    Group = Table.Group(Source, {"Изометричка", "КОМПЛЕКТ"}, {{"a", each [КОМПЛЕКТ]{0} & " (" & Text.Combine(List.Transform([#"Л."],Text.From),", ") &")"},{"b" , each List.Sum([Масса])},{"c",each Table.RowCount(_)}}),
    Group1 = Table.Group(Group, {"Изометричка"}, {{"Исходный комплект", each Table.Max(_,"c")[КОМПЛЕКТ]},{"Ссылки на РД",each Text.Combine([a],"; ")},{"Масса Трубопровода", each List.Sum([b])}}),
    Duplicate = Table.DuplicateColumn(Group1, "Исходный комплект", "Модель копирования")
in
    Duplicate
Изменено: Андрей Лящук - 07.03.2020 01:42:57
 
Андрей Лящук,теперь, в случае равенства количества листов в комплектах в "Модель копирования" попадает не первый следуемый в склейке ссылок...

Судя по результату, в "Исходный комплект" в случае равенства листов попадает последний комплект, который и выводится в "Модель копирования":
строки 2, 17, 27, 40-45, 65, 70, ...
 
Код
let
    Source = Excel.CurrentWorkbook(){[Name="ИсходныеДанные"]}[Content],
    Group = Table.Group(Source, {"Изометричка", "КОМПЛЕКТ"}, {{"a", each [КОМПЛЕКТ]{0} & " (" & Text.Combine(List.Transform([#"Л."],Text.From),", ") &")"},{"b" , each List.Sum([Масса])},{"c",each Table.RowCount(_)}}),
    Group1 = Table.Group(Group, {"Изометричка"}, {{"Исходный комплект", each (if List.Count(List.Distinct([c]))=1 then _{0} else Table.Max(_,"c"))[КОМПЛЕКТ]},{"Ссылки на РД",each Text.Combine([a],"; ")},{"Масса Трубопровода", each List.Sum([b])}}),
    Duplicate = Table.DuplicateColumn(Group1, "Исходный комплект", "Модель копирования")
in
    Duplicate
 
Андрей Лящук, последний нюанс, в примере его нет, но выявлен в рабочем файле.
Если несколько комплектов имеют максимальное число листов, то в значение "Исходный комплект" выводится значение комплекта, который идет последним.
В файле добавил строку для демонстрации - результат выделен оранжевым.
Изменено: jeka-irbis - 07.03.2020 23:40:12
 
Код
let
    Source = Excel.CurrentWorkbook(){[Name="ИсходныеДанные"]}[Content],
    Group = ((t)=>Table.AddIndexColumn(t,"d",Table.RowCount(t),-1))(Table.Group(Source, {"Изометричка", "КОМПЛЕКТ"}, {{"a", each [КОМПЛЕКТ]{0} & " (" & Text.Combine(List.Transform([#"Л."],Text.From),", ") &")"},{"b" , each List.Sum([Масса])},{"c",Table.RowCount}})),
    Group1 = Table.Group(Group, {"Изометричка"}, {{"Исходный комплект", each (if List.Count(List.Distinct([c]))=1 then _{0} else Table.Max(_,each Text.FromBinary(#binary({[c],[d]}))))[КОМПЛЕКТ]},{"Ссылки на РД",each Text.Combine([a],"; ")},{"Масса Трубопровода", each List.Sum([b])}}),
    Duplicate = Table.DuplicateColumn(Group1, "Исходный комплект", "Модель копирования")
in
    Duplicate
 
Андрей Лящук, я, наверное, уже надоел, но на рабочем файле на некоторых строках в ячейке "Исходный комплект" теперь выдает "error":
Код
Expression.Error: Число находится вне диапазона байтового значения.
Сведения:
    351
Предыдущая проблема устранена.
 
Добрый день!
Кто-нибудь может объяснить конструкцию Table.Max(_,each Text.FromBinary(#binary({[c],[d]}))) из #18 или помочь заменить ее на что-то другое, т.к. на рабочем файле выдает ошибку "Число находится вне диапазона байтового значения."?
Не понимаю я суть "двоичного значения"( Можно как-то попроще, для масс, пожалуйста.
 
Код
let
    Source = Excel.CurrentWorkbook(){[Name="ИсходныеДанные"]}[Content],
    Group = Table.AddIndexColumn(Table.Group(Source, {"Изометричка", "КОМПЛЕКТ"}, {{"a", each [КОМПЛЕКТ]{0} & " (" & Text.Combine(List.Transform([#"Л."],Text.From),", ") &")"},{"b" , each List.Sum([Масса])},{"c",Table.RowCount}}),"d",1,1),
    Group1 = Table.Group(Group, {"Изометричка"}, {{"Исходный комплект", each (if List.Count(List.Distinct([c]))=1 then _{0} else Table.Max(_,(x,y)=>Number.From(if x[c]<y[c] then x[d]>y[d] else 1)))[КОМПЛЕКТ]},{"Ссылки на РД",each Text.Combine([a],"; ")},{"Масса Трубопровода", each List.Sum([b])}}),
    Duplicate = Table.DuplicateColumn(Group1, "Исходный комплект", "Модель копирования")
in
    Duplicate
Изменено: Андрей Лящук - 13.03.2020 04:05:18
 
Андрей Лящук, спасибо большое! Теперь в рабочем файле все так, как задумывалось.
Страницы: 1
Наверх