Суммирование по множеству условий функцией БДСУММ (DSUM)

Для выборочного подсчета по нескольким условиям в больших таблицах можно использовать несколько способов: фильтры, сводные таблицы, функции СУММЕСЛИ и СУММЕСЛИМН и т.д.

Еще одним, относительно экзотическим, но весма мощным инструментом является функция БДСУММ (DSUM) из категории Работа с базой данных (Database). При внешней простоте, она позволяет гибко фильтровать списки по нескольким сложным и связанным между собой условиям и подсчитывает сумму найденных записей по заданному столбцу. Синтаксис функции таков:

=БДСУММ(Исходные_данные; Столбец_результата; Диапазон_условий)

где

  • Исходные_данные - диапазон, включающий в себя таблицу с данными, которые мы анализируем и строкой заголовка.
  • Столбец_результата - название (из шапки таблицы) или порядковый номер столбца, по которому нужно просуммировать данные.
  • Диапазон_условий - диапазон, содержащий названия столбцов и условия по ним.
Давайте рассмотрим детали и нюансы применения этой замечательной функции на практике. Допустим, что у нас есть вот такая таблица с данными по продажам:

База данных для анализа

Чтобы удобнее было ссылаться эту таблицу в будущем, конвертируем ее в "умную" командой Форматировать как таблицу на вкладке Главная (Home - Format as Table) или сочетанием клавиш Ctrl+T. На появившейся затем вкладке Конструктор (Design) зададим ей имя - например БазаДанных.

Простая сумма по одному условию

Начнем с простого случая. Допустим, нам нужно просуммировать стоимость по всем сделкам сока Добрый. Это будет выглядеть следующим образом:

Сумма по одному условию функцией БДСУММ

Обратите внимание на следующие моменты:

  • Не достаточно просто написать имя умной таблицы БазаДанных в первом аргументе, т.к. в этом случае ссылка не включает шапку, а для функции БДСУММ она необходима. Поэтому к имени добавляется тег [#Все] или, в английском варианте [#All].
  • Столбец, по которому нужно просуммировать данные можно задать либо названием ("Стоимость"), либо номером (было бы 5).
  • Название столбца в желтом диапазоне условий должно один-в-один совпадать с названием в исходной таблице. 
  • Функция БДСУММ не различает регистр символов (добрый = ДОБРЫЙ = Добрый = ДоБрЫй и т.д.)
  • Чтобы критерий в желтой ячейке А2 Excel не начал понимать как формулу (т.к. формулы обычно начинаются со знака равно) можно использовать текстовый формат или просто начать ввод в ячейку с апострофа:

    Апостроф в условиях для БДСУММ

Приблизительный и точный текстовый поиск

При необходимости, можно легко реализовать не только точный, но и приблизительный текстовый поиск. Посмотрите внимательно на следующие варианты суммирования выручки по городу Абакан и разницу между ними:

Точный и приблизительный поиск

  1. Если нужен поиск точного соответствия, то используем конструкцию '= (апостроф и знак равно).
  2. Если нужен поиск подстроки, т.е. всех ячеек, которые содержат нужное значение, то его надо заключить в звездочки. В нашем случае будут просуммированы все варианты Абакана (с "г.", без "г.", с пробелами перед-после и т.п.)
  3. Если просто ввести значение без равно и звездочек, то будут найдены и просуммированны все строки, где содержимое начинается с указанного значения, т.е. это равноценно звездочке в конце.

Несколько условий со связками "И" - "ИЛИ"

Если нужно просуммировать данные по нескольким условиям, связанным друг с другом логическим оператором И (AND), то ячейки с этими условиями должны быть в одной строке. Например, если нужно просуммировать все продажи Fanta по Абакану (в любом виде его написания), то это будет выглядеть так:

Сумма по двум условиям с И

Если же нужно связать несколько условий логическим оператором ИЛИ (OR), то их нужно расположить в разных строчках. Например, если нужно просуммировать деньги по всем вариантам написания "города на Неве", коих великое множество:

Несколько условий с ИЛИ

И конечно же, можно комбинировать оба подхода, сочетания в одном запросе условия со связками И и ИЛИ одновременно:

Несколько условий с И и ИЛИ одновременно

В этом случае вычисляется сумма продаж Fanta в Абакане и Burn у Дубинина.

Суммирование по интервалу дат

В диапазоне условий можно легко задать интервал дат для подсчета. Если интервал ограничен с двух сторон, то нужно будет задать два условия, связанных между собой логическим "И" - поэтому придется писать условия в одной строке, т.е. добавить еще один столбец с тем же названием Дата сделки:

Суммирование по интервалу дат

В данном случае вычисляется сумма продаж Fanta за 2016 год и Фруктайм до 2016 года.

Условия для чисел

Для отбора по числовым критериям можно смело использовать обычные знаки неравенств >, <, >=, <= как и в обычных формулах Excel. Например, если нам нужно просуммировать все продажи любых видов колы, где сумма сделки была в интервале 500-600:

Сумма по интервалу чисел

Исключения "все кроме"

Если нужно при суммировании исключить записи по какому-либо параметру, то можно использовать символы "<>" обозначающие "не равно" в синтаксисе Excel. Допустим, нам нужно просуммировать все данные по Fanta кроме Самары и по Квасу кроме Пензы - это будет выглядеть так:

Исключения

Обратите внимание, что если нужно просуммировать Fant'у И Квас по всем городам, кроме Самары И Пензы, то конструкция таблицы условий будет уже немного другая - для каждого товара нужно исключить каждый город:

Несколько исключений

Заключение

Надеюсь, вы уже поняли, что функция БДСУММ является очень неплохим инструментом и, зачастую, более удобной альтернативой классическим функциям выборочного подсчета типа СУММЕСЛИ (SUMIF) и СУММЕСЛИМН (SUMIFS). Кроме того, в той же категории Работа с базой данных (Database) можно найти ее "подруг", вычисляющих не только сумму:

  • БСЧЁТ (DCOUNTA) - количество непустых ячеек (в нашем случае - строк заказов)
  • ДМИН (DMIN) - минимальное (например, худшая сделка)
  • ДМАКС (DMAX) - максимальное (лучшая сделка)
  • ДСРЗНАЧ (DAVERAGE) - среднее арифметическое (например, средний чек)
У них тот же синтаксис, и все, что было разобрано выше, абсолютно аналогично работает и с этими функциями. Так что этой статьей мы убили с вами не одного зайца, а целых пять ;)

Ссылки по теме



01.05.2017 15:23:38

почему два раза начинается или тут какая та ошибка
01.05.2017 19:03:55
Никакой ошибки - так и задумано, чтобы показать, что последние два варианта - суть одно и то же.
03.05.2017 14:08:17
Спасибо;););)
16.05.2017 14:01:37
Доброго здоровья, Николай.

Можно ли в одной ячейке сделать суммирование-2D, чтобы собрать сумму ремонта по 2017 году (2018, 2019 и т.д.), имея данные за несколько лет, разбитых помесячно?
№ Состава1 янв 171 фев 171 мар 171 апр 171 май 17
1легкий ремонт2 320,002 320,003 480,002 320,002 320,00
тяжелый ремонт0,000,000,000,000,00
2легкий ремонт2 320,002 320,002 320,002 320,002 320,00
тяжелый ремонт0,000,000,000,000,00
3легкий ремонт2 320,002 320,002 320,002 320,002 320,00
тяжелый ремонт0,000,000,000,000,00
4легкий ремонт2 320,002 320,002 320,002 320,002 320,00
тяжелый ремонт0,000,000,000,000,00
5легкий ремонт2 320,002 320,003 480,002 320,002 320,00
тяжелый ремонт0,000,000,000,000,00
31.05.2017 16:34:19
Скажите, а что будет работать быстрее  СУММЕСЛИМН или БДСУММ?
27.04.2018 22:25:44
В статье не рассмотрен прием, когда критерий является расчетным, например для Условие для чисел
в A1 оставить пустым, а в a2
=AND(COUNTIF(Лист1!A2;"*Cola*");Лист1!E2>=500;Лист1!E2<=600)
 
итог можно расчитать по
=DSUM(БазаДанных[#All];"Стоимость";A1:A2)

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

Способ интересен тем что комбинировать условие может оказаться проще, а также появляются дополнительные возможности, брать значения с определенных строк по номеру, учитывать длину текстовых значений , использовать массивы значений .... любые фантазии.
тема с примером
27.08.2018 15:52:25
Николай, спасибо за статью.
Хотел сказать, что последний пример  "если нужно просуммировать Fant'у И Квас по всем городам, кроме Самары И Пензы" работает в такой конструкции только.
https://yadi.sk/i/M_Yj63aa3abU74
У вас сумма по Фанте и Квасу, не исключая города.
06.10.2018 23:01:23
Вопрос, а как вывести по дате? Пытаюсь решить свою задачу вывода данных, удовлетворяющих по критериям между двумя датами.
17.01.2019 22:52:40
Попробуйте ввод даты предварить одинарной кавычкой.
27.02.2019 16:47:29
Николай, здравствуйте.

В самом последнем примере
просуммировать Fant'у И Квас по всем городам, кроме Самары И Пензы
у вас ошибка. Это можно понять если логически разобрать пример:
(Фанта не из Самары) ИЛИ (Фанта не из Пензы) = Фанта из любого города
Или просто очистив условия на город, результат останется тем же. Ну или в лоб отфильтровать таблицу и посчитать сумму. Правильный вариант в последнем примере такой:

22.01.2020 11:32:56
 Николай, добрый день.
Может ли быть для БДСУММ в качестве критерия не только дата, но и время суток (часы : минуты)?
У меня данный критерий по такому типу не сработал:
 
время время
>=07:00<=11:00
29.01.2020 16:04:10
Прошу прощения - все работает. В базе данных оказались пробелы перед числами, из-за которых они не воспринимались формулой БДСУММ.
08.02.2023 14:11:32
Формула   =СЧЁТЕСЛИМН(.......) понятна, НО есть необходимость внести счёт и по дате в эту формулу. То есть если приход какого-то материала происходит дважды или трижды в один день, то она считает всё вместе.
Пример: 05.02.2023. был получен товар по трём накладным, а 09.02.2023 по одной. Счётеслимн подсчитает количество
равное 4, а нужно получить 2...
Подскажите пжлста...
02.10.2023 14:12:06
Добрый день. Вопрос - необходимо посчитать сумму с помощью БДСУММ по полю при условии , если сумма(разность, какое то другое вычисление) двух других полей в записи удовлетворяет определенному условию. Возможно ли такое условие описать не вводя дополнительных столбцов  с результатами этих вычислений? Допустим - просуммировать зарплату у людей с общим стажем более 5 лет, при том что есть столбцы стаж на предыдущих местах работы и стаж на текущем месте работы...
Наверх