Делаю первые шаги в освоении PQ и PP, помогите разобраться что использовать для добавления расчетных данных в исходную таблицу. Пример: Исходная таблица содержит значения в разрезе Регионов, статей и месяцев. Задача добавить в исходную таблицу расчетную статью №500 равную разнице 300-100 статей. для каждого региона и месяца. Что лучше использовать для таких расчетов PP или PQ для сложных формулах и больших объемах?
TankSpb, тут уже неоднократно писалось: если вам нужно вытащить расчетные данные в область значений отчета, то лучше всего использовать для этого меры если расчетные данные нужно использовать как измерения отчета (будете выводить их в строки или столбцы) то тогда нужно делать расчетные столбцы. А считать в PQ или в PP это уже вопрос сложности расчетов. Легкие лучше отдать PQ тогда не пострадает скорость загрузки в модель данных. Если же PQ не справляется с такими расчетами, то можно этот столбец рассчитать и в РР. Это если вкратце, а так-то там очень многое от мощности железа и еще кучи всяких мелких факторов.
TankSpb, Вы должны четко понимать предназначения инструментов которыми пользуетесь. PQ - предназначен в первую очередь для преобразования "сырых" данных в нормальные таблицы, с которыми уже можно работать далее. PP - инструмент для создания модели данных (реалицонная база данных на минималках) и последующих вычислений. Конечно, каждый из них могут взаимозаменять в некоторых моментах и иногда даже лучше делать предварительные вычисления в PQ. Но в целом: PQ - загрузили и обработали, PP - вычислили и проанализировали.
TankSpb написал: как быстро и правильно добавить её в мою таблицу я пока не знаю
У вас и не получится, т.к. я вашу таблицу фактов нормализовал. Посмотрите запрос PQ в примере. В том виде как это приведено у вас обычно таблицу фактов не оформляют. Вам нужно запросом с той же логикой обработать исходную таблицу, потом результат запроса поместить в модель данных, потом затащить туда все необходимые справочники измерений, потом сгенерить таблицу-календарь, потом наладить связи от справочников к таблице фактов и в результате получите стандартную модель для анализа. Для которой несложно составлять меры, и которая не будет тупить при расчетах.
Но вы бы все таки по ссылочке из предыдущего моего поста полазили б с недельку другую. С интерфейсом по-ковырялись, ибо такие элементарные вещи тут разжевывать мало кому интересно.
PooHkrd, Мы с вами немного ушли от самой задачи, цель была добавить в исходную таблицу расчетную статью №500 равную разнице 300-100 статей, а не создание отдельной сводной, если Ваша сводная это промежуточный расчет, то прошу показать, как его добавить в исходную таблицу.
В сводную я Меру добавил, даже привел к нужному формату, как красиво добавить это в исходник?
let
Source = Excel.CurrentWorkbook(){[Name="Данные"]}[Content],
Group = Table.Group(Source, {"Регион", "Месяц"}, {{"-",
each let
t=Table.Buffer(_[[Статья],[Факт18],[Факт19]]),
a=t{[Статья=300]},
b=t{[Статья=100]}
in Table.InsertRows(t,0,{[Статья=500,Факт18=a[Факт18]-b[Факт18],Факт19=a[Факт19]-b[Факт19]]})
}})
in
Table.ExpandTableColumn(Group, "-", {"Статья", "Факт18", "Факт19"})
TankSpb написал: Мы с вами немного ушли от самой задачи
Лично я никуда не отходил. Вы в примере не показали что хотите получить на выходе, дали только исходник. Т.к. выдумывать за вас я не могу то решил задачу как понял. Если не так понял, то извините - объясните более подробно.
Так надо было строк с новой статьей навтыкать? Так бы сразу и сказали. Вот мой вариант. Логика расчета та же что и у Андрея, но записано немножко по-другому, и я подстраховался от варианта если для одной статьи в одном месяце будет более одной строки.
Код
let
Source = Excel.CurrentWorkbook(){[Name="Данные"]}[Content],
GroupedRows = Table.Group( Source, {"Регион", "Месяц"}, {{"Записи", each
[t = Table.Buffer(_),
x = [ Статья = 500,
Факт18 = List.Sum({ List.Sum( Table.SelectRows(t, each [Статья] = 300)[Факт18] ), -List.Sum( Table.SelectRows(t, each [Статья] = 100)[Факт18] ) }),
Факт19 = List.Sum({ List.Sum( Table.SelectRows(t, each [Статья] = 300)[Факт19] ), -List.Sum( Table.SelectRows(t, each [Статья] = 100)[Факт19] ) })]][x] }}),
Expanded = Source & Table.ExpandRecordColumn(GroupedRows, "Записи", {"Статья", "Факт18", "Факт19"})
in
Expanded
PooHkrd, Спасибо за замечание, про задвоение, хотя в моем варианте правильно выдать в этом случае ошибку)
А что можно почитать, чтобы научится писать такие запросы? И можно тогда на моем примере показать как в одном запросе "навтыкать строк" с расчетом по Макро-Региону (сумма показателей Факт 18 и Факт 19 по каждому месяцу и каждой статье? У меня вот так получилось:
Код
let
Источник = Excel.CurrentWorkbook(){[Name="_500"]}[Content],
#"Измененный тип" = Table.TransformColumnTypes(Источник,{{"Факт18", type number}, {"Факт19", type number}}),
#"Сгруппированные строки" = Table.Group(#"Измененный тип", {"Месяц", "Статья"}, {{"Факт18", each List.Sum([Факт18]), type text}, {"Факт19", each List.Sum([Факт19]), type text}}),
#"Добавлен пользовательский объект" = Table.AddColumn(#"Сгруппированные строки", "Регион", each "МР"),
#"Добавленный запрос" = Table.Combine({#"Добавлен пользовательский объект", #"500"}),
#"Переупорядоченные столбцы" = Table.ReorderColumns(#"Добавленный запрос",{"Регион", "Месяц", "Статья", "Факт18", "Факт19"}),
#"Сортированные строки" = Table.Sort(#"Переупорядоченные столбцы",{{"Регион", Order.Ascending}, {"Месяц", Order.Ascending}, {"Статья", Order.Ascending}}),
#"Измененный тип2" = Table.TransformColumnTypes(#"Сортированные строки",{{"Статья", type text}, {"Факт18", type number}, {"Факт19", type number}, {"Регион", type text}, {"Месяц", Int64.Type}})
in
#"Измененный тип2"