Предположим, что на наших складах имеется такой товар:
Секция группировки объявляется ключевым словом СГРУППИРОВАТЬ ПО. Для чего нужна группировка в запросе? Совершенно верно, для объединения в группу одинаковых полей таблицы и получения суммарных результатов по остальным. Группировка сворачивает одинаковые поля запроса в одно, уменьшая тем самым количество результирующих записей. Сразу оговорюсь, если в запросе применяется группировка, то все поля должны быть разбиты на две категории: те по которым группируем и те которые группируются. Поясню на примере, допустим мы хотим узнать сколько у нас товара вообще, без учета складов, тогда мы напишем следующий код запроса:
Товар в данном случае — это поле по которому осуществляется группировка, а Количество — группируемое поле. СУММА — это агрегатная функция, она указывает запросу что все данные по количеству одинаковых товаров нужно просуммировать. Результатом выполнения этого запроса будет таблица вида:
Агрегатные функции
К группируемым полям должны быть обязательно применена агрегатная функция, это необязательно СУММА, а также МАКСИМУМ, МИНИМУМ, СРЕДНЕЕ, КОЛИЧЕСТВО, КОЛИЧЕСТВО РАЗЛИЧНЫХ. Рассмотрим более подробно действие каждой из них.
СУММА — применяется только для числовых полей, складывает переданные ей числа. Ее результат приведен на рисунке выше.
СРЕДНЕЕ — применяется только для числовых полей, вычисляет среднее — сумма переданных параметров / количество параметров:
МАКСИМУМ — может использоваться для любых полей, получает максимальный из переданных параметров. Допустим текст запроса имеет вид:
Т.е. имеем опять одно группировочное поле Товар и два группируемых поля: Склад и Количество. Результат выполнения этого запроса будет выглядеть следующим образом:
МИНИМУМ — может использоваться для любых полей, получает минимальный из переданных параметров:
КОЛИЧЕСТВО — может использоваться для любых полей, получает количество переданных параметров:
КОЛИЧЕСТВО РАЗЛИЧНЫХ — может использоваться для любых полей, получает количество различных параметров. Т.е. если функции передать параметры (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 |
Здесь то нам и поможет группировка.
Чтобы вы сами могли поэкспериментировать в консоли запросов, давайте воспроизведем
эту ситуацию с помощью небольшого запроса. Для начала сформируем исходную таблицу:
А теперь поместим нашу исходную таблицу во временную и выберем из нее данные с
группировкой по полю Товар
Жирным выделен код, который непосредственно учавствует в группировке.
СУММА() – это агрегатная функция.
СГРУППИРОВАТЬ ПО – это оператор после которого идет список
полей через запятую по которым производится группировка. По сути здесь должны быть
перечислены все поля из раздела ВЫБРАТЬ за исключением тех к которым
применены агрегатные функции. В противном случае выполнение запроса завершится с
ошибкой.
Таким образом группировка как бы схлопывает таблицу по полям идущим после
СГРУППИРОВАТЬ ПО. К остальным полям применяется та или иная агрегатная функция.
Применительно к нашему примеру, до группировки записей с товарами Ручка
и Карандаш у нас по две штуки, а после группировки — по одной.
При работе с таблицами значений аналогичную функцию выполняет метод Свернуть(),
за тем исключением, что там можно получать только сумму по полям не входящим в группировку.
В запросах же можно использовать несколько агрегатных функций. Давайте их перечислим
и кратко рассмотрим.
СУММА() – суммирует значения поля;
МИНИМУМ() – выбирает из всех значений поля минимальное;
МАКСИМУМ() – выбирает из всех значений поля максимальное;
СРЕДНЕЕ() – рассчитывает среднее значение (Сумма/Количество);
КОЛИЧЕСТВО() – выводит количество записей;
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ) – выводит количество записей у которых различаются значения;
Продемонстрируем их работу на нашем примере. Добавим в наш запрос другие агрегатные
функции кроме СУММЫ.
В результате выполнения запроса получим следующую таблицу:
Товар | Сумма | Минимум | Максимум | Среднее |
---|---|---|---|---|
Карандаш | 60 | 15 | 45 | 30 |
Ручка | 55 | 25 | 30 | 27,5 |
В предыдущем запросе не были использованы КОЛИЧЕСТВО() и
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ). Сделаем еще один запрос:
После выполнения получаем:
Количество | КоличествоРазличные |
---|---|
4 | 2 |
Здесь мы в поле Количество получили общее количество записей в таблице,
а в поле КоличествоРазличные – количество записей, у которых в поле
Товар значения различаются. Применительно к нашей таблице это Карандаш
и Ручка.
Как видно из последнего примера, если ко всем полям в запросе применяются
агрегатные функции, то использовать СГРУППИРОВАТЬ ПО не нужно.