Формулы в Power Query: синтаксис, функции и примеры применения
#Excel и Google Sheets #Power Query #Автоматизация аналитикиДля кого эта статья:
- Аналитики данных и специалисты по бизнес-аналитике
- Пользователи 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 раскрывается не в отдельных формулах, а в создании целостных решений, где каждый шаг преобразования логически связан с предыдущими и последующими. Это меняет не только скорость работы с данными, но и сам подход к аналитике — от реактивного к проактивному, от одноразовых манипуляций к масштабируемым системам обработки информации.
Читайте также
Дмитрий Белозёров
BI-аналитик