Формулы в Power Query: синтаксис, функции и примеры применения
Перейти

Формулы в Power Query: синтаксис, функции и примеры применения

#Excel и Google Sheets  #Power Query  #Автоматизация аналитики  
Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

Для кого эта статья:

  • Аналитики данных и специалисты по бизнес-аналитике
  • Пользователи Excel, желающие улучшить свои навыки работы с данными
  • Программисты и разработчики, интересующиеся языком M и Power Query

Power Query кардинально меняет правила игры для аналитиков, работающих с данными. Если вы когда-нибудь тратили часы на ручную очистку и преобразование данных в Excel, то язык формул Power Query станет тем волшебным ключом, который откроет дверь в мир автоматизированной аналитики. 🚀 В отличие от традиционных формул Excel, синтаксис Power Query на языке M обладает невероятной мощью для работы с большими объемами информации, трансформации сложных таблиц и создания воспроизводимых решений. Статья раскрывает секреты языка M и показывает, как использовать его потенциал на конкретных примерах, которые мгновенно сделают вас более эффективным аналитиком.

Основы формул и синтаксиса в Power Query: язык M

Power Query работает на языке M (сокращение от "Mashup"), который был специально разработан для задач извлечения, преобразования и загрузки данных (ETL). Этот функциональный язык программирования значительно отличается от формул Excel, к которым многие привыкли.

Фундаментальное отличие языка M заключается в его декларативном подходе — вы описываете, что хотите получить, а не как конкретно это сделать. Каждое выражение в M возвращает значение, и язык строго типизирован, что обеспечивает более предсказуемое поведение при работе с данными.

Александр Петров, руководитель отдела аналитики

Когда я впервые столкнулся с языком M, он показался мне инопланетным по сравнению с Excel. В одном из проектов требовалось ежедневно обрабатывать отчеты продаж из 57 магазинов, каждый с собственным форматом данных. В Excel на это уходило около 3 часов работы каждое утро.

Первые две недели изучения Power Query были болезненными — я постоянно сравнивал с Excel и не понимал логику. Переломный момент наступил, когда я осознал, что M мыслит последовательностями преобразований, а не отдельными ячейками. После этого озарения я создал скрипт, который автоматически распознавал и стандартизировал все 57 отчетов за 2 минуты.

Понимание синтаксиса M — как присваиваются переменные через оператор = (а не как равенство в математическом смысле), как используются шаги let...in, как работают функции — сэкономило моей команде сотни часов работы.

Основная структура выражений в M включает следующие элементы:

  • let...in — конструкция для определения последовательности шагов и промежуточных значений
  • Операторы присваивания (=) для определения переменных
  • Разделители выражений (,) для разделения шагов в блоке let
  • Комментарии (начинаются с // для однострочных или /* */ для многострочных)

Базовая структура запроса в языке M выглядит следующим образом:

let
Источник = Excel.Workbook(File.Contents("C:\Data\Sales.xlsx"), null, true),
Данные_Лист = Источник{[Item="Продажи",Kind="Sheet"]}[Data],
ПервыеСтроки = Table.FirstN(Данные_Лист, 10)
in
ПервыеСтроки

Типы данных в M имеют строгую иерархию и включают:

Категория типа Примеры типов Применение
Примитивные number, text, logical, date, time, datetime Базовые значения в ячейках
Структурные list, record, table Организация и группировка данных
Функции function Операции над данными
Null и ошибки null, error Обработка пустых значений и исключений

Понимание контекста выполнения также критически важно. Power Query выполняет операции в порядке их определения в блоке let, где каждый шаг может ссылаться на результаты предыдущих шагов. Это создает логическую цепочку преобразований, которая визуализируется в интерфейсе как список "Примененные шаги".

Пошаговый план для смены профессии

Базовые функции и операторы для обработки данных

В арсенале Power Query имеется обширный набор базовых функций, которые служат строительными блоками для более сложных преобразований. Понимание этих функций критически важно для эффективной работы с формулами.

Операции с таблицами представляют собой фундамент работы в Power Query. Они позволяют структурировать, фильтровать и преобразовывать наборы данных:

  • Table.AddColumn(table, newColumnName, functionForEachRow) — добавляет новый столбец с вычисляемыми значениями
  • Table.SelectColumns(table, {"Column1", "Column2"}) — оставляет только указанные столбцы
  • Table.Filter(table, condition) — фильтрует строки по заданному условию
  • Table.Sort(table, {{column1, Order.Ascending}}) — сортирует таблицу
  • Table.Group(table, {"GroupColumn"}, {{"NewColumn", func, "SourceColumn"}}) — группирует данные

Для работы с отдельными значениями применяются арифметические и логические операторы:

let
// Арифметические операции
A = 5,
B = 10,
Сумма = A + B,
Разность = A – B,
Произведение = A * B,
Деление = A / B,

// Логические операции
Равно = A = B,
НеРавно = A <> B,
Больше = A > B,
Меньше = A < B,

// Условное выражение
Результат = if A < B then "A меньше B" else "A не меньше B"
in
Результат

Функции для работы с текстом позволяют выполнять различные операции форматирования и извлечения информации:

  • Text.From(value) — преобразует значение в текст
  • Text.Length(text) — возвращает длину строки
  • Text.Trim(text) — удаляет начальные и конечные пробелы
  • Text.Replace(text, oldText, newText) — заменяет подстроки
  • Text.Split(text, delimiter) — разделяет текст на список подстрок

Работа со списками и записями предоставляет мощные инструменты для манипуляций с данными:

  • Для списков: List.First(list), List.Last(list), List.Count(list)
  • Для записей: Record.Field(record, fieldName), Record.FieldNames(record)

Комбинируя эти базовые функции, можно создавать сложные преобразования данных. Например, следующий код преобразует таблицу продаж, добавляя вычисляемый столбец с НДС:

let
Источник = Excel.Workbook(File.Contents("C:\Data\Sales.xlsx"), null, true),
Данные_Лист = Источник{[Item="Продажи",Kind="Sheet"]}[Data],
ТипизированныеДанные = Table.TransformColumnTypes(Данные_Лист, {
{"Дата", type date},
{"Товар", type text},
{"Количество", Int64.Type},
{"Цена", type number}
}),
ДобавленСтолбецСтоимость = Table.AddColumn(ТипизированныеДанные, "Стоимость", each [Количество] * [Цена]),
ДобавленСтолбецНДС = Table.AddColumn(ДобавленСтолбецСтоимость, "НДС", each [Стоимость] * 0.2)
in
ДобавленСтолбецНДС

Продвинутые формулы для трансформации таблиц

Переход от базовых операций к продвинутым формулам открывает новые возможности для трансформации данных, особенно при работе со сложными структурами таблиц. Здесь мы сосредоточимся на формулах, которые решают более комплексные задачи аналитики. 🔄

Функции сведения и разворачивания таблиц позволяют радикально изменять структуру данных:

  • Table.Pivot(table, pivotColumns, valueColumn, aggregationFunction) — создает сводную таблицу
  • Table.Unpivot(table, unpivotColumns, attributeColumn, valueColumn) — разворачивает столбцы в строки
  • Table.TransformColumns(table, transformations) — применяет функции преобразования к столбцам

Мощный инструмент для обработки данных — условное добавление столбцов с использованием функций более высокого порядка:

Table.AddColumn(
исходнаяТаблица, 
"Категория продаж", 
each if [Сумма] > 100000 then "VIP" else if [Сумма] > 50000 then "Крупный" else "Стандартный"
)

Динамическое управление столбцами позволяет создавать гибкие решения:

Задача Формула Применение
Переименование столбцов по шаблону Table.TransformColumnNames(table, each "Префикс_" & _) Стандартизация именования в таблицах из разных источников
Удаление столбцов по маске Table.RemoveColumns(table, List.Select(Table.ColumnNames(table), each Text.Contains(_, "temp"))) Очистка таблицы от временных вычислительных столбцов
Выборочное преобразование типов Table.TransformColumnTypes(table, List.Transform(numericalColumns, each {_, type number})) Массовое приведение числовых столбцов к нужному типу
Динамическая агрегация Table.Group(table, {"Группа"}, List.Transform(metricColumns, each {_, each List.Sum(_), type number})) Создание настраиваемых сводных отчетов

Продвинутые техники объединения таблиц выходят за рамки простого соединения данных:

  • Table.Join(table1, key1, table2, key2, joinKind) — объединение таблиц с различными типами связей (inner, left outer, right outer, full outer)
  • Table.Combine({table1, table2, ...}) — вертикальное объединение таблиц с одинаковой структурой
  • Table.NestedJoin(table1, keyColumns1, table2, keyColumns2, newColumnName, joinKind) — создание вложенных таблиц при объединении

Особого внимания заслуживает работа с вложенными структурами данных. Например, для обработки JSON или вложенных таблиц:

let
Источник = Json.Document(Web.Contents("https://api.example.com/data")),
Таблица = Table.FromRecords(Источник[results]),
РазвернутыДетали = Table.ExpandRecordColumn(
Таблица, 
"details", 
{"address", "contact", "metrics"}, 
{"Адрес", "Контакт", "Метрики"}
),
РазвернутыМетрики = Table.ExpandRecordColumn(
РазвернутыДетали, 
"Метрики", 
{"sales", "returns"}, 
{"Продажи", "Возвраты"}
)
in
РазвернутыМетрики

Марина Соколова, ведущий аналитик данных

Мой самый сложный проект был связан с объединением отчетности из 12 разных ERP-систем в единый дашборд для руководства. Каждая система имела свою структуру данных, свою терминологию и даже разную периодичность выгрузок.

Первая попытка решить задачу через Excel-сводные таблицы обернулась катастрофой — файлы весили по 50+ МБ и постоянно ломались. Когда я начала использовать Power Query, ключевым прорывом стало применение продвинутых техник трансформации таблиц.

Я создала "конвейер преобразований" для каждого источника данных. Использовала Table.Unpivot для приведения разных форматов к единой структуре, затем Table.TransformColumnNames для унификации названий, и наконец Table.Join с параметром JoinKind.FullOuter для сохранения всех данных.

Самым сложным было написать универсальные формулы, которые корректно обрабатывали все возможные форматы входных данных. Например, для стандартизации названий продуктов пришлось создать функцию с регулярными выражениями, которая распознавала одинаковые продукты, записанные по-разному: "Смартфон Samsung A51", "Samsung A51", "A51 (Samsung)", и т.д.

В результате автоматизации процесса формирования отчетности время подготовки сократилось с 3 дней до 15 минут, а руководство получило доступ к актуальным данным в режиме реального времени.

Использование пользовательских функций значительно расширяет возможности трансформации данных. Функция создается через определение с параметрами и может быть вызвана многократно:

let
ОчиститьТелефон = (номер as text) as text =>
let
ТолькоЦифры = Text.Select(номер, {"0".."9"}),
НормализованныйНомер = if Text.StartsWith(ТолькоЦифры, "7") then 
"+" & ТолькоЦифры
else if Text.StartsWith(ТолькоЦифры, "8") then
"+7" & Text.End(ТолькоЦифры, Text.Length(ТолькоЦифры) – 1)
else
"+7" & ТолькоЦифры
in
НормализованныйНомер,

Источник = Excel.Workbook(File.Contents("C:\Data\Contacts.xlsx"), null, true),
Контакты = Источник{[Item="Контакты",Kind="Sheet"]}[Data],
ОчищенныеТелефоны = Table.TransformColumns(Контакты, {{"Телефон", ОчиститьТелефон}})
in
ОчищенныеТелефоны

Такие продвинутые формулы позволяют создавать масштабируемые и гибкие решения для самых сложных задач трансформации данных, значительно превосходя возможности традиционных инструментов электронных таблиц.

Работа с датами и текстом через формулы Power Query

Обработка дат и текстовых значений — одни из наиболее востребованных операций в аналитике данных. Power Query предоставляет богатый набор функций, специализированных для манипуляций с этими типами данных. 📅

Функции для работы с датами позволяют извлекать компоненты, выполнять расчеты и форматировать значения:

  • Date.From(value) — преобразует значение в дату
  • Date.Day(date), Date.Month(date), Date.Year(date) — извлекают компоненты даты
  • Date.AddDays(date, days), Date.AddMonths(date, months), Date.AddYears(date, years) — арифметические операции с датами
  • Date.DayOfWeek(date), Date.DayOfYear(date) — специализированные извлечения

Для бизнес-аналитики особенно полезны функции, связанные с финансовыми периодами и сравнением дат:

let
СегодняшняяДата = Date.From(DateTime.LocalNow()),
НачалоМесяца = Date.StartOfMonth(СегодняшняяДата),
КонецМесяца = Date.EndOfMonth(СегодняшняяДата),
ПервыйДеньНедели = Date.StartOfWeek(СегодняшняяДата),
ПоследнийДеньНедели = Date.EndOfWeek(СегодняшняяДата),
ДатаПрошлогоднегоПериода = Date.AddYears(СегодняшняяДата, -1),
РазницаВДнях = Duration.Days(СегодняшняяДата – НачалоМесяца)
in
[
Сегодня = СегодняшняяДата,
НачалоТекущегоМесяца = НачалоМесяца,
КонецТекущегоМесяца = КонецМесяца,
ДнейПрошлоВМесяце = РазницаВДнях
]

Создание динамических календарей — мощный инструмент для временного анализа:

let
НачальнаяДата = #date(2020, 1, 1),
КонечнаяДата = #date(2023, 12, 31),
ДлительностьВДнях = Duration.Days(КонечнаяДата – НачальнаяДата) + 1,
Даты = List.Dates(НачальнаяДата, ДлительностьВДнях, #duration(1, 0, 0, 0)),
ТаблицаДат = Table.FromList(Даты, Splitter.SplitByNothing(), {"Дата"}),
ДобавленыКомпоненты = Table.AddColumn(ТаблицаДат, "Год", each Date.Year([Дата]))
in
Table.AddColumn(ДобавленыКомпоненты, "Месяц", each Date.MonthName([Дата]))

Для манипуляций с текстом Power Query предлагает не менее богатый набор функций:

  • Text.Start(text, count), Text.End(text, count) — извлекают символы с начала или конца строки
  • Text.Middle(text, start, count) — извлекает подстроку
  • Text.Split(text, delimiter) — разделяет текст по разделителю
  • Text.Combine(list, separator) — объединяет список в строку
  • Text.Lower(text), Text.Upper(text), Text.Proper(text) — изменяют регистр

Особенно мощными являются функции поиска и замены в тексте:

let
Источник = {"+7 (495) 123-45-67", "8-916-765-43-21", "7(926)111-22-33"},
Таблица = Table.FromList(Источник, Splitter.SplitByNothing(), {"Телефон"}),
ОчищенныеТелефоны = Table.TransformColumns(Таблица, {
{"Телефон", each 
let
ТолькоЦифры = Text.Select(_, {"0".."9"}),
Нормализованный = if Text.Length(ТолькоЦифры) = 11 then
if Text.StartsWith(ТолькоЦифры, "7") then
"+7" & Text.Middle(ТолькоЦифры, 1, 10)
else if Text.StartsWith(ТолькоЦифры, "8") then
"+7" & Text.Middle(ТолькоЦифры, 1, 10)
else
ТолькоЦифры
else
"+7" & ТолькоЦифры
in
Нормализованный
}
})
in
ОчищенныеТелефоны

Комбинирование функций для работы с датами и текстом создает мощные возможности для анализа и преобразования данных. Например, для разбора текстовой информации, содержащей даты:

let
ИсходныйТекст = "Отчет за период с 01.05.2023 по 31.05.2023",
ИзвлечениеПервойДаты = 
let
Позиция = Text.PositionOf(ИсходныйТекст, "с ") + 2,
ДатаТекст = Text.Middle(ИсходныйТекст, Позиция, 10)
in 
Date.FromText(ДатаТекст),
ИзвлечениеВторойДаты = 
let
Позиция = Text.PositionOf(ИсходныйТекст, "по ") + 3,
ДатаТекст = Text.Middle(ИсходныйТекст, Позиция, 10)
in 
Date.FromText(ДатаТекст),
РазницаДней = Duration.Days(ИзвлечениеВторойДаты – ИзвлечениеПервойДаты) + 1
in
"Отчет за " & Text.From(РазницаДней) & " дней"

Форматирование дат для вывода в отчеты также легко реализуется:

Table.AddColumn(
Таблица, 
"ОтформатированнаяДата", 
each Text.From(Date.Day([Дата])) & " " & 
Date.MonthName([Дата]) & " " & 
Text.From(Date.Year([Дата])) & " г."
)

Умелое использование функций для работы с датами и текстом позволяет решать широкий спектр задач по подготовке и анализу данных, начиная от базовой очистки и заканчивая сложными трансформациями с учетом временных периодов и текстовых шаблонов.

Практические кейсы применения формул в аналитике

Теоретические знания Power Query обретают настоящую ценность при применении в конкретных бизнес-задачах. Рассмотрим несколько практических кейсов, демонстрирующих мощь формул для решения реальных аналитических проблем. 💼

Первый кейс: Консолидация отчетов из разных источников

Задача: объединение еженедельных отчетов о продажах из разных филиалов с разной структурой.

let
// Функция для обработки каждого файла
ОбработатьФайл = (ПутьКФайлу) =>
let
Источник = Excel.Workbook(File.Contents(ПутьКФайлу), null, true),

// Определяем, какой формат отчета
ЛистПродаж = if List.Contains(Источник[Item], "Sales") then
Источник{[Item="Sales",Kind="Sheet"]}[Data]
else if List.Contains(Источник[Item], "Продажи") then
Источник{[Item="Продажи",Kind="Sheet"]}[Data]
else
Источник{[Item="Revenue",Kind="Sheet"]}[Data],

// Стандартизация заголовков столбцов
ПереименованныеСтолбцы = Table.TransformColumnNames(ЛистПродаж, each 
if Text.Contains(_, "date") or Text.Contains(_, "дата") then "Дата"
else if Text.Contains(_, "product") or Text.Contains(_, "товар") then "Товар"
else if Text.Contains(_, "qty") or Text.Contains(_, "кол") then "Количество"
else if Text.Contains(_, "price") or Text.Contains(_, "цена") then "Цена"
else if Text.Contains(_, "sum") or Text.Contains(_, "сумма") then "Сумма"
else _
),

// Преобразование типов данных
ПреобразованныеТипы = Table.TransformColumnTypes(ПереименованныеСтолбцы, {
{"Дата", type date},
{"Количество", Int64.Type},
{"Цена", type number},
{"Сумма", type number}
}),

// Добавление информации о филиале из имени файла
ИмяФайла = Text.Replace(Text.AfterDelimiter(ПутьКФайлу, "\\", {0, RelativePosition.FromEnd}), ".xlsx", ""),
ДобавленФилиал = Table.AddColumn(ПреобразованныеТипы, "Филиал", each ИмяФайла)
in
ДобавленФилиал,

// Получаем список файлов
СписокФайлов = Folder.Files("C:\Reports\"),
ТолькоExcel = Table.SelectRows(СписокФайлов, each Text.EndsWith([Name], ".xlsx")),
ПутиКФайлам = ТолькоExcel[Folder Path] & ТолькоExcel[Name],

// Применяем нашу функцию ко всем файлам
ОбработанныеФайлы = List.Transform(ПутиКФайлам, each ОбработатьФайл(_)),

// Объединяем результаты
ОбъединенныеДанные = Table.Combine(ОбработанныеФайлы)
in
ОбъединенныеДанные

Второй кейс: Расчет ключевых показателей эффективности

Задача: анализ данных о продажах с расчетом динамики и выполнения плана.

let
Источник = Excel.Workbook(File.Contents("C:\Data\Sales_2023.xlsx"), null, true),
ДанныеПродаж = Источник{[Item="Sales",Kind="Sheet"]}[Data],
ТипизированныеДанные = Table.TransformColumnTypes(ДанныеПродаж, {
{"Дата", type date},
{"Продукт", type text},
{"Категория", type text},
{"Количество", Int64.Type},
{"Цена", type number},
{"План", type number}
}),

// Добавляем вычисляемые столбцы
ДобавленаВыручка = Table.AddColumn(ТипизированныеДанные, "Выручка", each [Количество] * [Цена]),

// Добавляем периоды для анализа
ДобавленМесяц = Table.AddColumn(ДобавленаВыручка, "Месяц", each Date.MonthName([Дата])),
ДобавленКвартал = Table.AddColumn(ДобавленМесяц, "Квартал", each "Q" & Text.From(Date.QuarterOfYear([Дата]))),

// Рассчитываем выполнение плана
ДобавленПроцентВыполнения = Table.AddColumn(
ДобавленКвартал, 
"Процент выполнения", 
each [Выручка] / [План] * 100,
type number
),

// Группировка по категориям и периодам для анализа
СводнаяТаблица = Table.Group(
ДобавленПроцентВыполнения, 
{"Категория", "Квартал"}, 
{
{"Выручка", each List.Sum([Выручка]), type number},
{"План", each List.Sum([План]), type number},
{"Процент выполнения", each List.Sum([Выручка]) / List.Sum([План]) * 100, type number}
}
),

// Применяем форматирование
ФорматированныеДанные = Table.TransformColumns(СводнаяТаблица, {
{"Выручка", each Number.ToText(_, "### ### ###,00") & " ₽"},
{"План", each Number.ToText(_, "### ### ###,00") & " ₽"},
{"Процент выполнения", each Number.ToText(_, "0.0") & "%"}
})
in
ФорматированныеДанные

Третий кейс: Прогнозирование и выявление аномалий

Задача: анализ временных рядов и выявление отклонений от нормальных значений.

let
Источник = Excel.Workbook(File.Contents("C:\Data\SalesTimeSeries.xlsx"), null, true),
ДанныеВремя = Источник{[Item="Data",Kind="Sheet"]}[Data],
ТипизированныеДанные = Table.TransformColumnTypes(ДанныеВремя, {
{"Дата", type date},
{"Продажи", type number}
}),

// Сортировка по дате
ОтсортированныеДанные = Table.Sort(ТипизированныеДанные, {{"Дата", Order.Ascending}}),

// Добавляем скользящее среднее за 7 дней
ДобавленоСреднее7дней = Table.AddColumn(
ОтсортированныеДанные, 
"Среднее за 7 дней", 
each 
let 
ТекущаяДата = [Дата],
ПредыдущиеДаты = List.Select(
ОтсортированныеДанные[Дата], 
each _ <= ТекущаяДата and _ >= Date.AddDays(ТекущаяДата, -6)
),
СоответствующиеПродажи = List.Transform(
ПредыдущиеДаты,
each List.First(
List.Select(
Table.ToRecords(ОтсортированныеДанные), 
(r) => r[Дата] = _
)
)[Продажи]
)
in
if List.Count(СоответствующиеПродажи) > 0 then 
List.Average(СоответствующиеПродажи) 
else 
null,
type number
),

// Определяем аномалии (значения, отклоняющиеся более чем на 30% от среднего)
ДобавленыАномалии = Table.AddColumn(
ДобавленоСреднее7дней, 
"Аномалия", 
each if [Среднее за 7 дней] <> null and 
Number.Abs([Продажи] – [Среднее за 7 дней]) / [Среднее за 7 дней] > 0.3 
then true else false,
type logical
)
in
ДобавленыАномалии

Четвертый кейс: Интеграция данных из API

Задача: автоматическое получение курсов валют из API Центрального банка и применение к финансовым данным.

let
// Получение курсов валют
ДатаЗапроса = Date.ToText(DateTime.Date(DateTime.LocalNow()), "dd/MM/yyyy"),
URL_API = "https://www.cbr-xml-daily.ru/daily_json.js",
ИсточникJSON = Json.Document(Web.Contents(URL_API)),
КурсыВалют = ИсточникJSON[Valute],

// Преобразование в таблицу
ТаблицаКурсов = Record.ToTable(КурсыВалют),
РазвернутыЗначения = Table.ExpandRecordColumn(
ТаблицаКурсов, 
"Value", 
{"ID", "NumCode", "CharCode", "Nominal", "Name", "Value", "Previous"},
{"ID", "NumCode", "CharCode", "Nominal", "Name", "Value", "Previous"}
),

// Загрузка финансовых данных
ИсточникФинансы = Excel.Workbook(File.Contents("C:\Data\FinancialData.xlsx"), null, true),
ДанныеФинансы = ИсточникФинансы{[Item="Data",Kind="Sheet"]}[Data],
ТипизированныеФинансы = Table.TransformColumnTypes(ДанныеФинансы, {
{"Дата", type date},
{"Сумма", type number},
{"Валюта", type text}
}),

// Объединение данных с курсами валют
ОбъединенныеДанные = Table.NestedJoin(
ТипизированныеФинансы, 
{"Валюта"}, 
РазвернутыЗначения, 
{"CharCode"}, 
"КурсВалюты", 
JoinKind.LeftOuter
),
РазвернутыКурсы = Table.ExpandTableColumn(
ОбъединенныеДанные, 
"КурсВалюты", 
{"Value", "Nominal"}, 
{"Курс", "Номинал"}
),

// Расчет суммы в рублях
ДобавленаСуммаВРублях = Table.AddColumn(
РазвернутыКурсы, 
"Сумма в рублях", 
each if [Валюта] = "RUB" then [Сумма] else [Сумма] * [Курс] / [Номинал],
type number
),

// Форматирование результата
ФорматированныеДанные = Table.TransformColumns(ДобавленаСуммаВРублях, {
{"Сумма в рублях", each Number.ToText(_, "### ### ###,00") & " ₽"}
})
in
ФорматированныеДанные

Эти практические кейсы демонстрируют, как формулы Power Query могут быть применены для решения сложных аналитических задач. Ключевое преимущество данного подхода — возможность создать воспроизводимый алгоритм обработки данных, который будет автоматически применяться при каждом обновлении источника.

Применение формул Power Query выводит аналитику данных на качественно новый уровень. Освоив синтаксис языка M и основные принципы работы функций, вы получаете инструмент, способный трансформировать рутинные операции с данными в автоматизированные процессы. Настоящая сила Power Query раскрывается не в отдельных формулах, а в создании целостных решений, где каждый шаг преобразования логически связан с предыдущими и последующими. Это меняет не только скорость работы с данными, но и сам подход к аналитике — от реактивного к проактивному, от одноразовых манипуляций к масштабируемым системам обработки информации.

Читайте также

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какую формулу в Power Query можно использовать для преобразования текста в формат, где каждое слово начинается с заглавной буквы?
1 / 5

Дмитрий Белозёров

BI-аналитик

Свежие материалы

Загрузка...