Фильтрация данных – это одна из самых востребованных операций при работе с большими объемами информации. Часто требуется отфильтровать данные не только по одному условию, но и сразу по нескольким критериям одновременно, настроив порядок следования фильтров, изменив приоритеты или даже добавив исключающие условия («не равно», «содержит»). Для этого достаточно открыть окно редактирования запроса и вручную задать нужное поведение каждого фильтра. В этом кейсе мы рассмотрим несколько способов того, как можно эффективно выполнять фильтрацию строк по множеству условий в Power Query.
Представьте себе ситуацию, когда у вас есть большой набор данных (например, список компаний и детали платежей) и вам нужно исключить некоторых поставщиков, а так же исключить определенный вид операции, например, отобрать все услуги, кроме коммунальных платежей и все оплаты поставщикам, кроме оплаченных Иванову, Петрову и Сидорову. Именно такие задачи решаются через многоуровневую фильтрацию.
Power Query предоставляет мощные инструменты для выполнения таких задач быстро и без использования сложных формул или кода. Давайте посмотрим подробнее, какие шаги необходимо выполнить.
Алгоритм решения
- Исключить коммунальные платежи стандартным фильтром Power Query.
- Скорректировать формулу фильтрации с использованием операторов "and" и "or".
- Использовать функцию List.Contains и оператор "
not"для исключения некоторых контрагентов
Решение
- Для начала воспользуемся стандартным фильтром чтобы сформировать формулу фильтрации.

В результате у нас получится такая формула:
2. Затем мы корректируем формулу фильтрации, внося туда дополнения.

- К первому условию, описанному выше, добавим следующее: and ([Детализация платежа] <> "Оплата поставщику".
Это условие позволяет отобрать все платежи, которые не равны "Оплата поставщику", но при этом благодаря "and" (и) выполнить и первое условие (не брать строки, в которых содержатся "Коммунальные платежи").
И, наконец, с помощью оператора "or" (или) мы добавляем третье условие, состоящее из двух частей:
- ( [Детализация платежа] = "Оплата поставщику"
- and not List.Contains({"Иванов ИП", "Петров ИП", "Сидоров ИП"},[Контрагент]) )
То есть мы возьмем все строки, у которых детализация платежа равна "Оплата поставщику", но при этом Контрагент не является одним из тех, кто перечислен в списке.
Думаю, что вы обратили внимание на то, что второе и третье условие соединены не жестким "и", а вариативным "или". Потому, что нам нужны любые строки, не равные "Оплата поставщику" (и не равные "Коммунальные платежи" - первое условие), а так же нужны строки, которые равны "Оплата поставщику", но в которых при этом нет перечисленных контрагентов.
1 ( [Детализация платежа] <> "Коммунальные платежи" )
and
2 ( [Детализация платежа] <> "Оплата поставщику"
or
3 (
[Детализация платежа] = "Оплата поставщику"
and
not List.Contains( {"Иванов ИП", "Петров ИП", "Сидоров ИП"}, [Контрагент] )
)
)
)
Первое условие и группа следующих двух условий связаны оператором "and", заставляющих код отбирать лишь те строки, которые одновременно удовлетворяют и первое правило и группу следующих правил.
Внутри третьего условия две его части так же связаны жестким "and", заставляющим код отобрать лишь те строки, которые будут отвечать обеим частям третьего условия.
Итак, мы настроили порядок следования фильтров, изменили приоритеты и даже добавили исключающее условие «не содержит». Для этого мы немного отредактировали формулу фильтрации.
Заключение
Теперь ваши данные будут выглядеть красиво и удобно для анализа! Этот подход позволит вам быстро автоматизировать обработку данных даже если они содержат большое количество записей.
Надеюсь, этот небольшой лайфхак поможет вам сэкономить время и упростить работу с большими объемами информации. Удачи в ваших проектах и до новых встреч!
