Страницы: 1
RSS
Группировка с подстановкой значений в PQ
 

Всем привет!

В таблице, "создать новый столбец" и вывести в него значения: при повторяющихся значениях в столбце "КоординатаНЭ" вывести значение из столбца "Spool-ID", но если значение столбца " Spool-ID" содержит "" тогда вывести значение из столбца Element. Но только в позициях где в столбце №шва содержится значение "F".

Решение почти нашёл, объединил запрос самим собой

Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content],
    #"Объединенные запросы" = Table.NestedJoin(Источник,{"КоординатаНЭ"},Источник,{"КоординатаНЭ"},"Удаленные столбцы",JoinKind.LeftOuter),
    #"Развернутый элемент Удаленные столбцы" = Table.ExpandTableColumn(#"Объединенные запросы", "Удаленные столбцы", {"Spool-ID"}, {"Spool-ID.1"})
in
    #"Развернутый элемент Удаленные столбцы"

Но вот ни как не могу применить условие, что если столбец "Spool-ID" пустой разворачивать (подставлять) нужно столбец (Element)

Изменено: adamm - 08.06.2020 16:21:20
 
Таким образом пытался применить if, последняя строка
Код
let     
Источник = Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content],     
#"Объединенные запросы" = Table.NestedJoin(Источник,{"КоординатаНЭ"},Источник,{"КоординатаНЭ"},"Удаленные столбцы",JoinKind.LeftOuter),     
#"Развернутый элемент Удаленные столбцы" = #!"Table.ExpandTableColumn(#"Объединенные запросы",      
each if [#"Spool-ID"]<> null then "Удаленные столбцы", {"Spool-ID"}, {"Spool-ID.1"}) else ("Удаленные столбцы", {"Element"}, {"Element"}))" 
in    
#"Развернутый элемент Удаленные столбцы"  

Решение вроде как нашёл, но слишком мне кажется заморочено

Ошибся в данном случа он собирает все значения с обоих столбцов, а необходимо, только в случае если "Spool-ID" пустой(

Код
let    Источник = Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content],    
#"Объединенные запросы" = Table.NestedJoin(Источник,{"КоординатаНЭ"},Источник,{"КоординатаНЭ"},"Удаленные столбцы",JoinKind.LeftOuter),    
#"Развернутый элемент Удаленные столбцы" = Table.ExpandTableColumn(#"Объединенные запросы", "Удаленные столбцы", {"Spool-ID"}, {"Spool-ID.1"}),    
#"Развернутый элемент Удаленные столбцы2" = Table.ExpandTableColumn(#"Объединенные запросы", "Удаленные столбцы", {"Element"}, {"Spool-ID.1"}),    
#"Добавленный запрос" = Table.Combine({#"Развернутый элемент Удаленные столбцы", #"Развернутый элемент Удаленные столбцы2"}),    
#"Строки с примененным фильтром" = Table.SelectRows(#"Добавленный запрос", each ([#"Spool-ID.1"] <> null and [#"Spool-ID.1"] <> "")),    
#"Удаленные дубликаты" = Table.Distinct(#"Строки с примененным фильтром", {"БЛОК", "Номер линии", "№шва", "Spool-ID.1"})
in    
#"Удаленные дубликаты"

Изменено: adamm - 08.06.2020 17:23:02
 
adamm, так наверное
Код
let Source = Table.AddIndexColumn(Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content],"id"),
    Group = Table.Group(Source, {"КоординатаНЭ"},{{"a", each let a=_,b=a{1} in Table.AddColumn
    (a, "b", each try if Text.Contains([#"№шва"],"F") then if b[#"Spool-ID"]="" then b[Element]
    else b[#"Spool-ID"] else null otherwise null )}}),
    Custom1 = Table.RemoveColumns(Table.Sort(Table.Combine(Group[a]),{"id",0}),{"id"})
in  Custom1
 
Михаил Л, спасибо! Извините, что сразу не ответил. Можете пояснить?
1. В первой строчке, по мимо источника, вы добавили новый столбец id, но не указали первую цифру 0 или 1, то есть как понимаю, по умолчанию, если не указать, будет от 0
2. С группировкой не совсем понял, "a_" это вся таблица, "b" новый столбец с условием if, тут же не понимаю синтаксис "try" и "otherwise", гугл сообщил "пытаться" и "в противном случае", то есть в if можно добавить 3 результат?
3. В последней строчке разворачиваем столбцы и сортируем, но вот с Table.Combine не понял, ведь по сути можно было просто развернуть столбцы?
4. Так же не понимаю выражение each, гугл пишет:
"Ключевое слово each используется для удобного создания простых функций. "each ..." — это синтаксический сахар для сигнатуры функции, которая принимает параметр "(_) => ..."."
 
1. Да.
2. a=_  -  это вся таблица группы (там или две строки или одна строка), b=a{1}  - это вторая строка  таблицы (не в каждой таблице есть вторая строка, поэтому возвращается ошибка, с которой работают try и otherwise).
try и otherwise работают вместе (аналог ЕСЛИОШИБКА, гуглите на этом форуме). Убрал try и otherwise - результат тот же, только глаза мозолит сообщение о ошибке.
3. Разворачивать так разворачивать
Код
let    Source = Table.AddIndexColumn(Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content],"id"),
    Group = Table.Group(Source, {"КоординатаНЭ"},{{"a", each 
                        let 
                           a=_,b=a{1} 
                        in Table.AddColumn(a, "bbbb", each if Text.Contains([#"№шва"],"F") then if b[#"Spool-ID"]="" then b[Element] else b[#"Spool-ID"] else null)}}),
    #"Expanded {0}" = Table.ExpandTableColumn(Group[[a]], "a", {"БЛОК", "Номер линии", "№шва", "Element", "Spool-ID", "КоординатаНЭ", "id", "bbbb"}),
    Custom1 = Table.RemoveColumns(Table.Sort( #"Expanded {0}",{"id",0}),{"id"})
in
    Custom1
 
Михаил Л, можно записать b=a{1}?. Тогда в случае отсутствия второй строки вместо ошибки будет null.
Вот горшок пустой, он предмет простой...
 
Спасибо стало понятней!
 
PooHkrd,да, все так. Редко использую - поэтому и не вспоминается о таком приеме. Обхожу другими средствами
 
PooHkrd,заменил на b=a{1}? убрал try и otherwise null
Код
let Source = Table.AddIndexColumn(Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content],"id"),    Group = Table.Group(Source, {"КоординатаНЭ"},{{"a", each let a=_,b=a{1} in Table.AddColumn
    (a, "b", each if Text.Contains([#"№шва"],"F") then if b[#"Spool-ID"]="" then b[Element]
    else b[#"Spool-ID"] else null)}}),
    Custom1 = Table.RemoveColumns(Table.Sort(Table.Combine(Group[a]),{"id",0}),{"id"})
in  Custom1
Ошибка не уходит, "не может применить доступ к полям в типе null"
 
adamm, вы не поняли, знак вопроса всего лишь убирает ошибку при обращении к несуществующему элементу списка. А дальше уже в коде нужно как-то обрабатывать ситуацию, когда вместо второй строки у вас пустое значение. Конструкция try ... otherwise у Михаила обрабатывала целое выражение, а не простое обращение к элементу списка, поэтому нельзя делать так, как вы сделали, тут нужен более комплексный подход. В код я погружаться сейчас времени не имею, тут уж извините. Только общими объяснениями.
Вот горшок пустой, он предмет простой...
 
PooHkrd,ок, понял
Страницы: 1
Наверх