Страницы: 1
RSS
Умножение массива на число по условию в PQ, PQ, умножить часть массива на 1000
 
Товарищи, всем доброго дня!
Подскажите, пожалуйста, как можно произвести умножение на 1000 определённой части массива в PQ.
Задача такая.
В массиве данных (более 4 млн.строк) есть малая часть массива в натуральном выражении и большая часть в стоимостном.
Стоимостной массив в тыс.₽ и надо его перевести в рубли умножением на 1000, при этом обойти натуральные показатели (штуки).
Коды натуральных показателей начинаются с 1...., а остальные денежные показатели с прочих чисел.
Как можно прописать условие для данной задачи?
 
Так?
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="пример"]}[Content],
    #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(Источник, {"Склад", "Код", "Статья"}, "Attribute", "Value"),
    #"Added Custom" = Table.AddColumn(#"Unpivoted Other Columns", "Custom", each [Value]*1000),
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Value"}),
    #"Pivoted Column" = Table.Pivot(#"Removed Columns", List.Distinct(#"Removed Columns"[Attribute]), "Attribute", "Custom")
in
    #"Pivoted Column"
Изменено: jakim - 23.06.2022 11:24:58
 
jakim, спасибо, но нет.
В вашем варианте изменения коснулись всего массива.
Надо только стоимостной массив перевести в рубли умножением на 1000, а штуки (краны, болты, гайки...там всякие есть) оставить как есть.
Можно для условия написание функции использовать момент, что в колонке Код все штучные статьи начинаются с единицы 1***** (каждый код состоит из 6 цифр), а вот всё то что касается денег с других чисел от 2***** до 9*****.
 
Тогда может так?
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="пример"]}[Content],
    #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(Источник, {"Склад", "Код", "Статья"}, "Attribute", "Value"),
    #"Duplicated Column" = Table.DuplicateColumn(#"Unpivoted Other Columns", "Код", "Код - Copy"),
    #"Split Column by Position" = Table.SplitColumn(Table.TransformColumnTypes(#"Duplicated Column", {{"Код - Copy", type text}}, "lt-LT"), "Код - Copy", Splitter.SplitTextByRepeatedLengths(1), {"Код - Copy.1", "Код - Copy.2", "Код - Copy.3"}),
    #"Changed Type" = Table.TransformColumnTypes(#"Split Column by Position",{{"Код - Copy.1", Int64.Type}, {"Код - Copy.2", Int64.Type}, {"Код - Copy.3", Int64.Type}}),
    #"Removed Columns" = Table.RemoveColumns(#"Changed Type",{"Код - Copy.2", "Код - Copy.3"}),
    #"Filtered Rows" = Table.SelectRows(#"Removed Columns", each ([#"Код - Copy.1"] = 2)),
    #"Removed Columns1" = Table.RemoveColumns(#"Filtered Rows",{"Код - Copy.1"}),
    #"Added Custom" = Table.AddColumn(#"Removed Columns1", "Custom", each [Value]*1000),
    #"Removed Columns2" = Table.RemoveColumns(#"Added Custom",{"Value"}),
    #"Renamed Columns" = Table.RenameColumns(#"Removed Columns2",{{"Custom", "Value"}}),
    #"Appended Query" = Table.Combine({#"Renamed Columns", #"пример (3)"}),
    #"Pivoted Column" = Table.Pivot(#"Appended Query", List.Distinct(#"Appended Query"[Attribute]), "Attribute", "Value")
in
    #"Pivoted Column"
 
jakim, всё сломалось :-)
Что такое "пример (3)"?
 
Пример(2) и Пример(3) получены из дубликтов Примера для фильтрации кодов с последующим объединением одну таблицу.
 
На моём массиве не работает... зависает и всё.
 
tmhashNIK, попробуйте так:
Код
let
  src = Excel.CurrentWorkbook(){[ Name = "пример" ]}[Content],
  dataClmns = List.Buffer ( List.RemoveItems ( Table.ColumnNames ( src ), { "Склад", "Код", "Статья" } ) ),
  typed = Table.TransformColumnTypes (
    src,
    { { "Склад", type text }, { "Код", type text }, { "Статья", type text } } & List.Transform ( dataClmns, ( x ) => { x, type number } )
  ),
  transformLst = List.Buffer ( List.Transform ( dataClmns, ( x ) => { x, ( y ) => y * 1000 } ) ),
  transform = Table.FromRecords (
    Table.TransformRows ( typed, ( r ) => if Text.StartsWith ( r[Код], "1" ) then r else Record.TransformFields ( r, transformLst ) ),
    Value.Type ( typed )
  )
in
  transform
Изменено: surkenny - 23.06.2022 23:57:04
 
surkenny, супер! Спасибо вам! Работает круто и быстро!  
Позвольте немного обнаглеть и спросить, как добавить ещё одно условие... выяснилось, что данные Мск уже будут преобразованы в исходнике и их не нужно будет умножать на 1000.
То есть преобразовать стоимостные показатели на двух складах, кроме Мск.
 
Замените  строку
Код
Table.TransformRows ( typed, ( r ) => if Text.StartsWith ( r[Код], "1" ) then r else Record.TransformFields ( r, transformLst ) ),

на строку:
Код
Table.TransformRows ( typed, ( r ) => if Text.StartsWith ( r[Код], "1" ) or Text.StartsWith (Text.Upper( r[Склад]), "МСК" ) then r else Record.TransformFields ( r, transformLst ) ),
 
Msi2102, благодарю! Всё работает превосходно :-)
 
surkenny,
Msi2102, товарищи доброго дня!
А можете мне по возможности кратко чутка пояснить суть работы кода по каждой строке? Их не очень много :-)
Для понимая. Пытался сам, но всё равно не догоняю: зачем создается список, а потом развёртывается...
 
Цитата
tmhashNIK написал:
зачем создается список, а потом развёртывается
Список нигде не развертывается. Читайте описание Record.TransformFields: вторым аргументом нужно передать список списков ( { { Имя записи1, Функция преобразования1 }, .. , { Имя записиN, Функция преобразованияN }  } ). Вот и создаем этот список.
Изменено: surkenny - 27.06.2022 23:13:32
 
surkenny, спасибо вам, буду изучать!
А что означают символы =>?
Изменено: tmhashNIK - 28.06.2022 09:26:17
Страницы: 1
Наверх