Файл: Хрусталева Е. Ю. Язык запросов 1С-Предприятия 8 (2013).pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.03.2019
Просмотров: 51769
Скачиваний: 8724
В данном запросе записи исходной таблицы с одинаковыми значениями полей
Покупатель и Товар собираются вместе. Причем поскольку мы обращаемся к табличной
части документа РасходнаяНакладная, для выбора реквизита Покупатель мы
обращаемся к нему через точку от поля табличной части Ссылка. Затем для каждого
товара по каждому покупателю с помощью агрегатной функции СУММА() подсчитывается
суммарное значение полей Количество и Сумма из состава расходных накладных и
выводится в полях выборки запроса.
Обратите внимание, что в тексте запроса имена полей в списке группировки принято
располагать на разных строках со смещением относительно ключевого слова
СГРУППИРОВАТЬ ПО.
В результате в нижней таблице мы видим общее количество и сумму продаж каждого
товара по каждому покупателю, а в верхней таблице для сравнения приведен состав всех
расходных накладных, упорядоченный по покупателям и товарам (рис. 1.52).
Рис. 1.52. Общее количество и сумма продаж каждого товара по каждому покупателю
Иногда требуется наложить условие на значения агрегатных функций, применяемых к
исходным записям с одинаковым значением поля группировки. Это можно сделать с
помощью ключевого слова ИМЕЮЩИЕ, после которого задается условие отбора
аналогично условию в предложении ГДЕ, но только оно накладывается не на исходные
записи, а на записи, получившиеся в результате группировки.
Например, нам нужно увидеть, какие товары и какому покупателю были проданы на сумму
свыше 50 000. Это можно сделать с помощью следующего запроса (листинг 1.56).
Листинг 1.56. Отбор товаров, проданных на сумму более 50 000 по каждому покупателю
То есть мы просто добавили в текст предыдущего запроса конструкцию ИМЕЮЩИЕ
<Условие отбора>.
В итоге из общего списка продаж каждого товара по каждому покупателю (верхняя
таблица) в результат запроса попадут только те записи (нижняя таблица), в которых
сумма продаж товара по каждому покупателю, вычисленная в результате группировки,
больше 50 000 (рис. 1.53).
Рис. 1.53. Отбор товаров, проданных на сумму более 50 000 по каждому покупателю
Как узнать среднюю цену поступления товара, не группируя сами записи
Очень часто требуется не только вывести определенные данные в результат запроса, но
и рассчитать по ним некоторые обобщенные данные (построить итоги). Что значит
рассчитать итоги и в чем отличие построения итогов от группировки записей, поясним на
конкретном примере.
Для наглядности проведем аналогию с примером «
Как узнать среднюю цену, по которой
». В нем мы группировали записи исходной таблицы по полю Товар,
чтобы узнать, например, среднюю цену продаж каждого товара. Но при группировке
записи, содержащие одинаковые значения полей, по которым группируются исходные
данные, сворачиваются в одну, для каждой группы записей вычисляются значения
агрегатных функций и помещаются в результат запроса.
При построении итогов (так же, как и при группировке) записи, содержащие одинаковые
значения полей, по которым нужно рассчитать итоги, собираются вместе, для каждой
группы записей вычисляются значения агрегатных функций. При этом результат
вычислений помещается в итоговые строки и добавляется к записям исходной таблицы
(детальным записям). То есть детальные записи не сворачиваются, а, наоборот,
достраиваются относительно исходной таблицы и служат для детализации итоговых
строк.
На рис. 1.54 демонстрируется отличие группировки записей из состава приходных
накладных по полю Товар от расчета итогов по этому же полю.
Рис. 1.54. Отличие группировки записей таблицы от построения итогов по одному и тому же полю
В верхней таблице выводятся все записи из состава приходных накладных, в которых
записи с одинаковым значением поля Товар расположены друг за другом.
В нижней левой таблице выводится результат построения итогов по полю Товар, при этом
для каждого товара рассчитывается средняя цена поступления, а также общее
количество и сумма поступления товара. Результат вычислений помещается в итоговые
строки и добавляется к детальным записям.
В нижней правой таблице выводится результат группировки записей приходных накладных
по полю Товар. При этом для каждого товара рассчитываются те же агрегатные функции,
но в результате запроса для каждого товара выводится одна запись, в которую
помещается результат вычисления агрегатных функций.
Нетрудно увидеть, что итоговые строки в левой таблице (18 = 12 + 6) совпадают со
строками в правой таблице (6) и дополняются строками из верхней таблицы (12).
Для построения итогов используется предложение ИТОГИ … ПО, которое располагается
в секции Описание итогов текста запроса. Все секции запроса приведены на
Получить результат запроса, показанный на рис. 1.54, содержащий итоги по полю Товар,
можно с помощью следующего запроса (листинг 1.57).
Листинг 1.57. Вывод всех записей из состава приходных накладных с итоговыми данными для каждого товара
Описание итогов начинается с ключевого слова ИТОГИ. После него следует список
итоговых полей, перечисленных через запятую. В качестве итоговых полей обычно
выступает результат вычисления агрегатных функций, рассчитанный для детальных
записей с одинаковыми значениями полей, по которым требуется рассчитать итоги. Затем
следует ключевое слово ПО, после которого перечисляется список контрольных точек
– полей, по которым необходимо рассчитать итоги.
В данном случае Товар – это контрольная точка, а СУММА(Количество),
СРЕДНЕЕ(Цена), СУММА(Сумма) – это итоговые поля, которые требуется рассчитать
для каждой контрольной точки.
В результате выполнения запроса мы видим 18 записей – 12 записей из исходной таблицы
(см. рис. 1.54) и 6 итоговых записей, по одной на каждый товар. Итоговая запись
содержит представление самого товара, а также общее количество, сумму и среднюю
цену его поступления (рис. 1.55).