Страницы: 1
RSS
Как посчитать в PQ суммы заказов по товарам?
 
Доброй ночи!
В книге Николая Павлова по PQ есть пример (во вложении). Как посчитать в PQ суммы заказов по товарам?
 
Доброй ночи
как-то так можно
Код
let
    Источник = Table.NestedJoin(Товары,{"Товар"},Заказы,{"Товар"},"Заказы",JoinKind.LeftOuter),
    Пользовательская1 = Table.SplitColumn(Источник, "Заказы", each {Text.Combine(List.Transform([Номер заказа],Text.From),", "),List.Sum([Стоимость])},{"Номера заказов","Общая стоимость"})
in
    Пользовательская1
 
Доброе время суток
Андрей Лящук, отличный подход, спасибо! Вы не тестировали, что быстрее работает: Table.SplitColumn или Table.ExpandRecordColumn?
Изменено: Андрей VG - 02.03.2020 07:01:37
 
Добрый вечер
Сейчас поигрался с фалом из этой темы

Состряпал 2 запроса
Код
let
    Source = Table.Combine(List.Repeat({Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content][[Столбец1],[Столбец2]]},6000)),
    Source2 = Table.ToColumns(Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content]),
    Col = List.Transform({1..List.Count(Source2)},each "Время."&Text.From(_)),
    AddList = Table.AddColumn(Source, "Время", let b=List.Repeat({0},List.Count(Source2)) in (r)=>let d=List.PositionOf(Source2,r[Столбец2],0,(e,f)=>List.AnyTrue(List.Transform(e,each Text.Contains(f,_)))) in if d>=0 then List.ReplaceRange(b,d,1,{r[Столбец1]}) else b),
    Before = List.Buffer({DateTime.LocalNow()}),
    SplitList = Record.ToList([a=Before{0},b=Table.Buffer(Table.SplitColumn(AddList,"Время",each _)),c=DateTime.LocalNow(),d=c-a])
in
    SplitList

и
Код
let
    Source = Table.Combine(List.Repeat({Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content][[Столбец1],[Столбец2]]},6000)),
    Source2 = Table.ToColumns(Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content]),
    Col = List.Transform({1..List.Count(Source2)},each "Время."&Text.From(_)),
    AddRec = Table.AddColumn(Source, "Время", let b=List.Repeat({0},List.Count(Source2)) in (r)=>let d=List.PositionOf(Source2,r[Столбец2],0,(e,f)=>List.AnyTrue(List.Transform(e,each Text.Contains(f,_)))) in Record.FromList(if d>=0 then List.ReplaceRange(b,d,1,{r[Столбец1]}) else b,Col)),
    Before = List.Buffer({DateTime.LocalNow()}),
    ExpandRec = Record.ToList([a=Before{0},b=Table.Buffer(Table.ExpandRecordColumn(AddRec,"Время",Col)),c=DateTime.LocalNow(),d=c-a])
in
    ExpandRec

Выгружаю оба на лист
taskkill -f -im microsoft.mash*
Ctrl+Alt+F5

Результаты за несколько прогонов
SplitListExpandRecord
35,471 сек33,089 сек
31,461 сек30,300 сек
34,107 сек32,961 сек
34,891 сек33,611 сек
30,814 сек30,194 сек
33,665 сек32,319 сек
Изменено: Андрей Лящук - 02.03.2020 21:32:34
 
Цитата
Андрей Лящук написал:
как-то так можно
Мощно! По-заграничному!  :idea: Ну и от себя добавлю набивший оскомину вариант:
Код
Table.Join(
    Товары,
    {"Товар"},
    Table.Group(
        Table.RenameColumns(Заказы, {"Товар","Товар1"}), 
        {"Товар1"}, 
        {{"Номера заказов", each Text.Combine(List.Transform([Номер заказа], Text.From), ", ")}, {"Общая стоимость", each List.Sum([Стоимость])}}),
    {"Товар1"},
    JoinKind.LeftOuter)[[Товар],[Номера заказов],[Общая стоимость]]

Цитата
Андрей Лящук написал:
taskkill -f -im microsof.mash*
А можно про вот это поподробнее? Что и куда?
Изменено: PooHkrd - 02.03.2020 21:18:09
Вот горшок пустой, он предмет простой...
 
PooHkrd, у меня там очепятка была, букву t пропустил

Win+R
taskkill -f -im microsoft.mash*
Enter


Завершает все процессы Microsoft.Mashup.Container.NetFX40.exe
Страницы: 1
Наверх