Язык запросов 1С 8.3 для начинающих программистов: группировка
Автор уроков и преподаватель школы: Владимир Милькин
Группировка в запросах
Давайте запросим из таблицы Справочник.Еда следующие реквизиты: Наименование, Цвет и Калорийность:
ВЫБРАТЬ Наименование, Цвет, Калорийность ИЗ Справочник.Еда |
У вас другой порядок строк в результате?
Теперь предположим, что нам необходимо вычислить суммарную калорийность продуктов для каждого цвета.
Алгоритм для жёлтого цвета будет такой:
- Находим все строчки у которых в поле Цвет стоит Жёлтый.
- Это будут строчки №1, 6, 8 и 9.
- Суммируем поле Калорийность для каждой из этих строк: 89 + 31 + 340 + 536
- Получаем, что для жёлтого цвета суммарная калорийность равна 996.
И так для каждого цвета.
Описанный выше процесс называется группировкой. Таким образом, группировка - это "схлопывание" (свёртка) строчек таблицы по определенному признаку.
При группировке все поля делятся на две группы:
- Группировочные - это как раз те поля, по которым идёт свёртка. В нашем случае таким полем является Цвет.
- Группируемые - это те поля, которые сворачиваются (схлопываются, объединяются). В нашем случае таким полем является Калорийность.
Группируемые поля не могут быть сами по себе. К ним обязательно применяется одна из агрегатных функций: СУММА, СРЕДНЕЕ, МИНИМУМ, МАКСИМУМ, КОЛИЧЕСТВО, КОЛИЧЕСТВО РАЗЛИЧНЫЕ:
Агрегатная функция СУММА
Это как раз случай, который мы разбирали. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Все строки группируются по группировочным полям (Цвет), а группируемые поля (Калорийность) суммируются:
ВЫБРАТЬ Цвет, СУММА(Калорийность) ИЗ Справочник.Еда СГРУППИРОВАТЬ ПО Цвет |
У вас другой порядок строк в результате?
Агрегатная функция СРЕДНЕЕ
В этом случае все строки группируются по группировочным полям (Цвет), а среди группируемых полей (Калорийность) находится среднее значение:
ВЫБРАТЬ Цвет, СРЕДНЕЕ(Калорийность) ИЗ Справочник.Еда СГРУППИРОВАТЬ ПО Цвет |
У вас другой порядок строк в результате?
Агрегатная функция МИНИМУМ
В этом случае все строки группируются по группировочным полям (Цвет), а среди группируемых полей (Калорийность) находится минимальное значение:
ВЫБРАТЬ Цвет, МИНИМУМ(Калорийность) ИЗ Справочник.Еда СГРУППИРОВАТЬ ПО Цвет |
У вас другой порядок строк в результате?
Агрегатная функция МАКСИМУМ
В этом случае все строки группируются по группировочным полям (Цвет), а среди группируемых полей (Калорийность) находится максимальное значение:
ВЫБРАТЬ Цвет, МАКСИМУМ(Калорийность) ИЗ Справочник.Еда СГРУППИРОВАТЬ ПО Цвет |
У вас другой порядок строк в результате?
Агрегатная функция КОЛИЧЕСТВО
В этом случае все строки группируются по группировочным полям (Цвет), а среди группируемых полей (Калорийность) находится их количество:
ВЫБРАТЬ Цвет, КОЛИЧЕСТВО(Калорийность) ИЗ Справочник.Еда СГРУППИРОВАТЬ ПО Цвет |
У вас другой порядок строк в результате?
Агрегатная функция КОЛИЧЕСТВО РАЗЛИЧНЫЕ
В этом случае все строки группируются по группировочным полям (Цвет), а среди группируемых полей (Калорийность) находится количество элементов с различными значениями:
ВЫБРАТЬ Цвет, КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Калорийность) ИЗ Справочник.Еда СГРУППИРОВАТЬ ПО Цвет |
У вас другой порядок строк в результате?
Функция КОЛИЧЕСТВО РАЗЛИЧНЫЕ требует пояснения, потому что на выбранном примере её результат совпадает с функцией КОЛИЧЕСТВО. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Вот более показательный пример, который всё объясняет:
Группировка без группируемых полей и агрегатных функций
Использование агрегатных функций в запросе не требуется, если результатом запроса будут только группировочные поля:
К примеру, сделаем выборку всех вкусов, которые встречаются среди еды:
ВЫБРАТЬ
Вкус
ИЗ
Справочник.Еда |
У вас другой порядок строк в результате?
Как видите вкусы повторяются - давайте их сгруппируем:
ВЫБРАТЬ
Вкус
ИЗ
Справочник.Еда
СГРУППИРОВАТЬ ПО
Вкус |
У вас другой порядок строк в результате?
Таким образом, мы сделали группировку только по группировочным полям (Вкус). Группируемые поля, а следовательно и агрегатные функции нам не понадобились.
Группировка без группировочных полей
Соответственно использование группировочных полей также не требуется, если результатом запроса будут только группируемые поля:
К примеру, получим результаты агрегатных функций применительно к полю Калорийность без группировочных полей (то есть по всей таблице):
ВЫБРАТЬ СУММА(Калорийность) КАК Сумма, СРЕДНЕЕ(Калорийность) КАК Среднее, МИНИМУМ(Калорийность) КАК Минимум, МАКСИМУМ(Калорийность) КАК Максимум, КОЛИЧЕСТВО(Калорийность) КАК Количество ИЗ Справочник.Еда |
Группировка по нескольким полям
Группировочных (как впрочем и группируемых) полей может быть сколь угодно много. В запросе они перечисляются через запятую.