1С запрос сгруппировать по

Предположим, что на наших складах имеется такой товар:

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

Товар в данном случае — это поле по которому осуществляется группировка, а Количество — группируемое поле. СУММА — это агрегатная функция, она указывает запросу что все данные по количеству одинаковых товаров нужно просуммировать. Результатом выполнения этого запроса будет таблица вида:

Агрегатные функции

К группируемым полям должны быть обязательно применена агрегатная функция, это необязательно СУММА, а также МАКСИМУМ, МИНИМУМ, СРЕДНЕЕ, КОЛИЧЕСТВО, КОЛИЧЕСТВО РАЗЛИЧНЫХ. Рассмотрим более подробно действие каждой из них.

СУММА — применяется только для числовых полей, складывает переданные ей числа. Ее результат приведен на рисунке выше.

СРЕДНЕЕ — применяется только для числовых полей, вычисляет среднее — сумма переданных параметров / количество параметров:

МАКСИМУМ — может использоваться для любых полей, получает максимальный из переданных параметров. Допустим текст запроса имеет вид:

Т.е. имеем опять одно группировочное поле Товар и два группируемых поля: Склад и Количество. Результат выполнения этого запроса будет выглядеть следующим образом:

МИНИМУМ — может использоваться для любых полей, получает минимальный из переданных параметров:

КОЛИЧЕСТВО — может использоваться для любых полей, получает количество переданных параметров:

КОЛИЧЕСТВО РАЗЛИЧНЫХ — может использоваться для любых полей, получает количество различных параметров. Т.е. если функции передать параметры (1,1,2,3,3,3,4,4,4,4,4,5), то она вернет 5. Функция КОЛИЧЕСТВО вернула бы 12. Запрос с использованием функции КОЛИЧЕСТВО РАЗЛИЧНЫХ будет выглядеть так:

Пусть мы группируем по двум полям: Товар и Склад:

для различных агрегатных функций результат будет следующим:

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

Виртуальная таблица
Виртуальная таблица применяется для обращения к итогам и автоматической свертки по нужным полям.
Например:
можно получить все итоги регистра (итоги по всем измерениям и ресурсам),
Код 1C v 8.х
итоги по контрагенту и ресурсу Сумма
Код 1C v 8.х
итоги в разрезе контрагентов и товаров по двум ресурсам
Код 1C v 8.х

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

Сгруппировать по
Конструкция — сгруппировать по аналогично методу Свернуть для таблицы значений и слову Группировка в языке запросов 7.7. При применении этой конструкции в результате запроса остаются только группировочные записи. Это ключевое слово обычно применяется совместно с агрегатными функциями в списке полей выборки.
Код 1C v 8.х

Код 1C v 8.х
Итоги применяются для построения отчетов, сводной таблицы или сводной диаграммы. Для двух последних использование ИТОГОВ обязательно!
При применении этой конструкции в результате запроса остаются детальные записи И итоговые записи (напоминает Сгруппировать По). При этом агрегатные функции перечисляются в предложении ИТОГИ, а не в списке полей ВЫБРАТЬ.
Код 1C v 8.х

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

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

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

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

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

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

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

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

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

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

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

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

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

ТоварСуммаМинимумМаксимумСреднее
Карандаш60154530
Ручка55253027,5

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

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

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

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

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

Оцените статью
Много толка
Добавить комментарий