Read professional hostgator reviews wrote by customers. Also check out these great inmotion reviews web hosting.

Группировка данных в запросе

Создано 28 Декабрь 2012
Автор: Дмитрий Котельников

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

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

    Запрос.Текст = "
        |ВЫБРАТЬ
        |    Товары.Товар,
        |    СУММА(Товары.Количество) КАК Количество
        |ИЗ
        |    Справочник.Товары КАК Товары
        |
        |СГРУППИРОВАТЬ ПО
        |    Товары.Товар";

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

Сумма

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

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

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

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

Среднее

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

    Запрос.Текст = "
        |ВЫБРАТЬ
        |    Товары.Товар,
        |    МАКСИМУМ(Товары.Склад) КАК Склад,
        |    МАКСИМУМ(Товары.Количество) КАК Количество
        |ИЗ
        |    Справочник.Товары КАК Товары
        |
        |СГРУППИРОВАТЬ ПО
        |    Товары.Товар";

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

Максимум

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

Минимум

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

Количество

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

    Запрос.Текст = "
        |ВЫБРАТЬ
        |    Товары.Товар,
        |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Товары.Склад) КАК Склад,
        |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Товары.Количество) КАК Количество
        |ИЗ
        |    Справочник.Товары КАК Товары
        |
        |СГРУППИРОВАТЬ ПО
        |    Товары.Товар";

Результат:

Rjkbxtcndj различных

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

    Запрос.Текст = "
        |ВЫБРАТЬ
        |    Товары.Товар,
        |    Товары.Склад КАК Склад,
        |    <АГРЕГАТНАЯ ФУНКЦИЯ>(Товары.Количество) КАК Количество
        |ИЗ
        |    Справочник.Товары КАК Товары
        |
        |СГРУППИРОВАТЬ ПО
        |    Товары.Товар,
        |    Товары.Склад";

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

Общее

 Подведем итоги:

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

 

← Базовые конструкции языка запросов | Условия в запросах →

 

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


Защитный код
Обновить

© 2012, Котельников Дмитрий. При любом копировании материалов ссылка на сайт-источник zapros-1c-8.ru обязательна.