Профессия — 1С

Рукопашный бой Карташ

Категории

Группировка в запросах 1С

рубрики: Запросы | Дата: 4 Ноябрь, 2016

В этой статье рассмотрим группировку в запросах 1С 8 и
агрегатные функции с помощью которых эта группировка и делается.




Проще всего объяснить, что такое группировка, на примере.
Допустим, что у нас есть таблица с количеством товаров на складах:

Склад Товар Количество
Центральный Карандаш 45
Центральный Ручка 30
Офис Карандаш 15
Офис Ручка 25

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

Товар Количество
Карандаш 60
Ручка 55

Здесь то нам и поможет группировка.

Чтобы вы сами могли поэкспериментировать в консоли запросов, давайте воспроизведем
эту ситуацию с помощью небольшого запроса. Для начала сформируем исходную таблицу:


ВЫБРАТЬ
    "Центральный" КАК Склад,
    "Карандаш" КАК Товар,
    45 КАК Количество
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
    "Центральный", "Ручка",	30
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
    "Офис",	"Карандаш",	15
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
    "Офис",	"Ручка", 25

А теперь поместим нашу исходную таблицу во временную и выберем из нее данные с
группировкой по полю Товар





ВЫБРАТЬ
    "Центральный" КАК Склад,
    "Карандаш" КАК Товар,
    45 КАК Количество
ПОМЕСТИТЬ ВТ_Количество
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
    "Центральный", "Ручка",	30
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
    "Офис", "Карандаш",	15
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
    "Офис", "Ручка", 25
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Количество.Товар,
    СУММА(ВТ_Количество.Количество) КАК Количество
ИЗ
    ВТ_Количество КАК ВТ_Количество

СГРУППИРОВАТЬ ПО
    ВТ_Количество.Товар
	

Жирным выделен код, который непосредственно учавствует в группировке.
СУММА() – это агрегатная функция.
СГРУППИРОВАТЬ ПО – это оператор после которого идет список
полей через запятую по которым производится группировка. По сути здесь должны быть
перечислены все поля из раздела ВЫБРАТЬ за исключением тех к которым
применены агрегатные функции. В противном случае выполнение запроса завершится с
ошибкой.

Таким образом группировка как бы схлопывает таблицу по полям идущим после
СГРУППИРОВАТЬ ПО. К остальным полям применяется та или иная агрегатная функция.
Применительно к нашему примеру, до группировки записей с товарами Ручка
и Карандаш у нас по две штуки, а после группировки — по одной.
При работе с таблицами значений аналогичную функцию выполняет метод Свернуть(),
за тем исключением, что там можно получать только сумму по полям не входящим в группировку.
В запросах же можно использовать несколько агрегатных функций. Давайте их перечислим
и кратко рассмотрим.

СУММА() – суммирует значения поля;
МИНИМУМ() – выбирает из всех значений поля минимальное;
МАКСИМУМ() – выбирает из всех значений поля максимальное;
СРЕДНЕЕ() – рассчитывает среднее значение (Сумма/Количество);
КОЛИЧЕСТВО() – выводит количество записей;
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ) – выводит количество записей у которых различаются значения;
Продемонстрируем их работу на нашем примере. Добавим в наш запрос другие агрегатные
функции кроме СУММЫ.


ВЫБРАТЬ
    ВТ_Количество.Товар,
    СУММА(ВТ_Количество.Количество) КАК Сумма,
    МИНИМУМ(ВТ_Количество.Количество) КАК Минимум,
    МАКСИМУМ(ВТ_Количество.Количество) КАК Максимум,
    СРЕДНЕЕ(ВТ_Количество.Количество) КАК Среднее
ИЗ
    ВТ_Количество КАК ВТ_Количество
СГРУППИРОВАТЬ ПО
    ВТ_Количество.Товар

В результате выполнения запроса получим следующую таблицу:

Товар Сумма Минимум Максимум Среднее
Карандаш 60 15 45 30
Ручка 55 25 30 27,5

В предыдущем запросе не были использованы КОЛИЧЕСТВО() и
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ). Сделаем еще один запрос:


ВЫБРАТЬ
    КОЛИЧЕСТВО(ВТ_Количество.Товар) КАК Количество,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВТ_Количество.Товар) КАК КоличествоРазличные
ИЗ
    ВТ_Количество КАК ВТ_Количество

После выполнения получаем:

Количество КоличествоРазличные
4 2

Здесь мы в поле Количество получили общее количество записей в таблице,
а в поле КоличествоРазличные – количество записей, у которых в поле
Товар значения различаются. Применительно к нашей таблице это Карандаш
и Ручка.

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

   

2018г. Профессия — 1С. Обмен опытом по программированию в 1С