Страницы: 1
RSS
Группировка значений с дополнительным условию в PQ
 
Всем привет!
Хочу сгруппировать значения в таблице с дополнительным условием, ранее создавал подобную тему, но в данном случае задача немного другая, по сути если применить функции то это "счетеслимн", но вот в PQ не получается, код, что состряпал:
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Измененный тип" = Table.TransformColumnTypes(Источник,{{"Area", Int64.Type}, {"Line-Ref", type text}, {"Spool-ID", type any}, {"WeldPrefix", type text}, {"FullWeldNo", type text}, {"NS", Int64.Type}, {"Inches1", type number}, {"Статус готовности", type text}, {"Статус", type text}, {"Комплектность1", type text}}),
    

#"Сгруппированные строки" = Table.Group(#"Измененный тип", {"Area", "Line-Ref", "Spool-ID", "WeldPrefix"}, {
        {"temp", each Table.RowCount(each [addedValue = Table.AddColumn(_, "ФронтS", each if [#"WeldPrefix"] = "S" then [Inches1] else 0)][addedValue],type number)}                    }),
    
#"Развернутый элемент temp" = Table.ExpandTableColumn(#"Сгруппированные строки", "temp", {"ФронтS"}, {"ФронтS"})
in
    #"Развернутый элемент temp"
 
adamm, с колонками для группировки непонятно. Сгруппировал по двум колонкам
Код
// Таблица1 (2)
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Измененный тип" = Table.TransformColumnTypes(Источник,{{"Area", Int64.Type}, {"Line-Ref", type text}, {"Spool-ID", type any}, {"WeldPrefix", type text}, {"FullWeldNo", type text}, {"NS", Int64.Type}, {"Inches1", type number}, {"Статус готовности", type text}, {"Статус", type text}, {"Комплектность1", type text}}),
    #"Grouped Rows" = Table.Group(#"Измененный тип", {"Area", "Spool-ID"}, {{"Line-Ref", each _[#"Line-Ref"]{0}},{"WeldPrefix", each List.RemoveNulls(_[WeldPrefix]){0}},{"as",  each if List.Count(List.Distinct(_[WeldPrefix]))>1 then null else List.Sum(_[Inches1]) 
}})
in
    #"Grouped Rows"
 
Михаил Л, спасибо! Все работает, и со столбцами порядок, но не совсем то, в данном случае функция считает, как "СУМЕСЛИМН", а мне нужно "СЧЁТЕСЛИМН", то есть подсчитать кол-во строк, как я писал выше. Пытался заменить List.Sum на Table.RowCount, но выдаёт ошибку
 
Цитата
adamm написал:
заменить List.Sum
else List.Count(_[Inches1])
 
случайно else стер, спасибо все работает!
 
Михаил Л, можете помочь разобраться с кодом, как я понял:
тут мы выбираем столбцы по которым будем осуществлять группировку
Код
{"Area", "Spool-ID", "Line-Ref"}
далее в столбце "WeldPrefix" выводим список значений без null начиная с первого значения, то есть убрали пустые ячейки
Код
{{"WeldPrefix", each List.RemoveNulls(_[WeldPrefix]){0}}
далее условие если:
Код
if
удаляем дубликаты в "WeldPrefix"
Код
List.Distinct
выводим количество получившихся чисел
Код
List.Count
и если оно больше 1 то null в противном случае выводим количество строк
честно после if я запутался)
Суть в том, что я хочу добавить ещё условие для вывода значений
Изменено: adamm - 02.04.2020 11:43:54
 
Вот обычная группировка с подсчетом значений в указанном столбце, причем группировка по двум столбцам  {"Area", "Spool-ID"}
Код
= Table.Group(#"Измененный тип", {"Area", "Spool-ID"}, {{"as",  each  List.Count(_[Inches1]) }})
В примере были указаны еще два столбца - Line-Ref и WeldPrefix . Так как в группировку их включить нельзя, иначе результатом будет больше двух строк. Например, в столбце Line-Ref в красной зоне и FG-0017 и FG-0011.
Но в желаемом результате эти столбцы были, поэтому для них отдельные группировки - {"Line-Ref", each _[#"Line-Ref"]{0}}   и    {"WeldPrefix", each List.RemoveNulls(_[WeldPrefix]){0}} .  Без {0} вернутся списки, а с {0} получаем первое значение списка. А List.RemoveNulls на всякий случай удаляет пустые значения. Эти два столбца никак не влияют на эту группировку
Код
{"as",  each if List.Count(List.Distinct(_[WeldPrefix]))>1 then null else List.Count(_[Inches1]) }
В этой группировке сначала идет подсчет уникальных значений столбца WeldPrefix и если значений один, то выполняется подсчет значений в столбце Inches1, если значений два и более, то не выполняется подсчет, а просто выдает null.
Если в столбце будут, помимо пустых значений, два и более разных значений, то результат будет не ожидаемым. В примере показал. Так же смотрите что будет в результате, если в столбце Line-Ref будут разные значения.
 
Михаил Л, вот я и думаю, когда начал проставлять F, не то считать стал,  не совсем пример корректный выложил( .
Получается для то го, что бы исправить ситуацию, группировку листов по первому значению, вообще придётся исключить, а заменить на подсчёт уникальных значений, как в третьем случае, да их всего будет два F и S тогда можно прописать условие не по 1, а по S и F? И треть группировку менять так же придётся? Все оказалось намного проще, применил фильтр, тем самым исключив "F"
Изменено: adamm - 02.04.2020 16:27:55
 
Всем привет!
Не стал опять же плодить новую тему, так как вопрос, "все вокруг да около", да и вообще с группировкой в PQ можно создавать отдельную ветку, ну это так к слову. Суть вопроса сгруппирорвать стоки получив сумму при условии, в примере выложил со счетом количества строк, но мне нужно сосчитать сумму, а не количество строк, вот ни как не додумаю как прописать "List.Sum".
 
adamm, по какому столбцу считать?
Сделал сумму по столбцу Количество
Код
= Table.Group(#"Измененный тип", {"БЛОК", "Номер линии"}, {{"Манипуляция", each List.Sum(Table.SelectRows(_, each [#"Вид работ"]="Манипуляция")[Количество])},{"Монтаж", each List.Sum(Table.SelectRows(_, each [#"Вид работ"]="Монтаж")[Количество])}})
 
Михаил спасибо! Вот только как понять, что столбец количество нужно показать после списка, в справочнике об этом ни слова. То есть как понять, что вот эта связка дает список:
Код
each (Table.SelectRows(_, each [#"Вид работ"]="Манипуляция")[Количество])

List.Sum(list as list, optional precision as nullable number) as any
Возвращает сумму всех значений в списке list, отличных от NULL. Возвращает значение NULL, если в списке нет значений, отличных от NULL.

Или это просто нужно знать)
Изменено: adamm - 17.06.2020 08:26:21
 
Цитата
adamm написал:
как понять, что вот эта связка дает список
Таблица[Столбец] - дает список из элементов Столбца, в то время как Таблица{Строка} дает запись из элементов Строки.
Да,
Цитата
adamm написал:
это просто нужно знать)
Изменено: buchlotnik - 17.06.2020 08:48:03
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
adamm написал:
Или это просто нужно знать)
А ведь я уже неоднократно предлагал к изучению тыц1, тыц2. Там это все есть и по-русски.
Вот горшок пустой, он предмет простой...
 
Цитата
adamm написал:
только как понять, что столбец количество нужно показать после списка, в справочнике об этом ни слова. То есть как понять, что вот эта связка дает список
Не ну я знаю что функции с приставкой List.  работают только со списком, поэтому кормлю их одним столбцом в виде списка.
Может в запросе понятнее будет.
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Рабочая_папка_накопительная_ТТ__ПЕНЕКС"]}[Content],
    #"ОТФИЛЬТРОВАЛИ НУЖНЫЕ ЗНАЧЕНИЯ" = Table.SelectRows(Источник, each [#"Вид работ"]="Манипуляция" and [#"Номер линии"]="BFW-0002"),
    #"НЕ СРАБОТАЛО" = List.Sum(#"ОТФИЛЬТРОВАЛИ НУЖНЫЕ ЗНАЧЕНИЯ"),
    #"ОСТАВИЛИ СТОЛБЕЦ ДЛЯ СУММИРОВАНИЯ" = #"ОТФИЛЬТРОВАЛИ НУЖНЫЕ ЗНАЧЕНИЯ"[Количество],
    СРАБОТАЛО = List.Sum(#"ОСТАВИЛИ СТОЛБЕЦ ДЛЯ СУММИРОВАНИЯ"),
    #"ЗАПИСАЛ ВСЕ РАЗОМ" = List.Sum(Table.SelectRows(Источник, each [#"Вид работ"]="Манипуляция" and [#"Номер линии"]="BFW-0002")[Количество])
in
    #"ЗАПИСАЛ ВСЕ РАЗОМ"
 
Всем спасибо, за разъяснения, PooHkrd, возможно упустил обязательно почитаю! Ошибся статью читал, но на момент прочтения многое хоть и понятно, но без практики не закрепишь, шаг за шагом двигаемся вперед)
Изменено: adamm - 17.06.2020 09:58:36
Страницы: 1
Наверх