рубрики: Запросы | Дата: 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 |
Здесь мы в поле Количество получили общее количество записей в таблице,
а в поле КоличествоРазличные – количество записей, у которых в поле
Товар значения различаются. Применительно к нашей таблице это Карандаш
и Ручка.
Как видно из последнего примера, если ко всем полям в запросе применяются
агрегатные функции, то использовать СГРУППИРОВАТЬ ПО не нужно.
Добавить комментарий