К статьям

Агрегатные функции в запросе

3 мин


В языке запросов 1С:Предприятие 8 предусмотрено использование агрегатных функций. Эти функции необходимы, в случаях когда нам нужно вычислить какое-то одиночное значение из набора значений. К примеру, у нас есть некоторый набор чисел (3, 1, 4, 5), с помощью агрегатных функций мы можем их просуммировать, получив число 13, или вычислить минимум - число 1. Все из них имеют аналогичный синтаксис и используются похожим образом.

Сумма


СУММА(ИмяПоля) – суммирует значения колонки (поля). Следует помнить, что суммировать можно только числовые поля. Если поле имеет составной тип данных, содержит не только числовые значения, то функция может быть применена, но в случае появления в выборке нечислового поля, выполнение запроса закончится с ошибкой.

Пример, вычислим общее количество товаров находящееся во всех документах "Поступление товаров и услуг":

ВЫБРАТЬ 
   СУММА(ПоступлениеТоваровУслугТовары.Количество) КАК ОбщееКоличествоТоваров,

ИЗ

    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары

Минимум


МИНИМУМ(ИмяПоля) – вычисляет минимальное значение колонки (поля).

Максимум


МАКСИМУМ(ИмяПоля) – вычисляет максимальное значение колонки (поля).

Среднее


СРЕДНЕЕ(ИмяПоля) – вычисляет среднее значение колонки (поля).

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

Количество


КОЛИЧЕСТВО(ИмяПоля) – подсчитывает количество значений колонки

КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ИмяПоля) - подсчитывает количество уникальных значений колонки

Примеры


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

ВЫБРАТЬ 
   
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПоступлениеТоваровУслугТовары.Номенклатура) КАК КоличествоРазличныхНоменклатур,
   
СУММА(ПоступлениеТоваровУслугТовары.Количество) КАК ОбщееКоличествоТоваров,
   МИНИМУМ(ПоступлениеТоваровУслугТовары.Сумма) КАК МинимальнаяСуммаПокупки

ИЗ

    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары


Если в выборке пристутствуют поля не использующие агрегатные функции, они обязательно должны быть указаны в секции СГРУППИРОВАТЬ ПО: 

ВЫБРАТЬ 
   ПоступлениеТоваровУслугТовары.Номенклатура
,

   КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПоступлениеТоваровУслугТовары.ЕдиницаИзмерения)

ИЗ

    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары

СГРУППИРОВАТЬ ПО

    ПоступлениеТоваровУслугТовары.Номенклатура 

В таком случае поля указанные в секции СГРУППИРОВАТЬ будут использованы в качестве разрезов группировки. И значения агрегатных функций будут рассчитаны в разрезе этих группировок. 

К примеру есть следующий набор данных:

Номенклатура Количество
Яблоко 1
Яблоко 3
Апельсин 2
Апельсин 4

Мы используем агрегатную функцию Сумма на колонке "Количество", чтобы вычислить общее количество товаров

 ВЫБРАТЬ

    ТаблицаТоваров.Номенклатура,

    СУММА(ТаблицаТоваров.Количество) КАК Количество

ИЗ

    ТаблицаТоваров КАК ТаблицаТоваров

СГРУППИРОВАТЬ ПО

    ТаблицаТоваров.Номенклатура 

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

Номенклатура Количество
Яблоко 4
Апельсин 6

Повторяющиеся значения номенклатуры превратились в одну, а их количества просуммировались. 

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

Стоит отметить, что перечисленные функции также могут использоваться и с оператором ВЫБОР.

Пример, зададим условие на количество товаров, и определим значения поля, если условия выполняются:

 ВЫБРАТЬ

    Товары.Номенклатура КАК Номенклатура,

    ВЫБОР

        КОГДА СУММА(Товары.Количество) > 5

            ТОГДА "Нормально"

        ИНАЧЕ "Слишком мало"

    КОНЕЦ КАК ОценкаПокупок

ИЗ

    Документ.ПоступлениеТоваровУслуг.Товары КАК Товары

СГРУППИРОВАТЬ ПО

    Товары.Номенклатура 

Результатом может быть такая таблица: 

Номенклатура ОценкаПокупок
Апельсины Слишком мало
Яблоки Слишком мало
Клубника Слишком мало
Салфетки Нормально
Фруктовый сок Слишком мало
Фруктово-ореховая смесь Нормально

 

Задачи на эту тему:

Рейтинг -1

Комментарии
  • бикукле
    бикукле

    про "Имеющие()" ничего не написано хотя в задаче 26 указано


    • eldarmingaliev
      eldarmingaliev

      бикукле, Спасибо! Дополним