0
Анатолий Nemo
02.09.19
✎
14:32
|
Всем привет.
Изучаю язык запросов. Есть простой справочник:
Наименование Реквизит1 Реквизит2 Реквизит3
Элемент1 1 1 1
Элемент2 1 2 10
Элемент3 2 1 100
Есть запрос:
ВЫБРАТЬ
Реквизит1, Реквизит2, Реквизит3
ИЗ
Справочник.Справочник1
ИТОГИ
СУММА(Реквизит3)
ПО
Реквизит1, Реквизит2
Запрос обрабатывается:
Результат=Запрос.Выполнить();
Выборка=Результат.Выбрать(ОбходРезультатаЗапроса.Прямой,"Реквизит1,Реквизит2",",Реквизит1");
Получается такая выборка:
ТипЗаписи -- Итог по группировке; Группировка -- Реквизит1; Реквизит1 -- 1; Реквизит2 -- NULL; Реквизит3 -- 11;
ТипЗаписи -- Итог по группировке; Группировка -- Реквизит2; Реквизит1 -- 1; Реквизит2 -- 2; Реквизит3 -- 10;
ТипЗаписи -- Детальная запись; Группировка -- ; Реквизит1 -- 1; Реквизит2 -- 2; Реквизит3 -- 10;
ТипЗаписи -- Итог по группировке; Группировка -- Реквизит2; Реквизит1 -- 1; Реквизит2 -- 1; Реквизит3 -- 1;
ТипЗаписи -- Детальная запись; Группировка -- ; Реквизит1 -- 1; Реквизит2 -- 1; Реквизит3 -- 1;
ТипЗаписи -- Итог по группировке; Группировка -- Реквизит1; Реквизит1 -- 2; Реквизит2 -- NULL; Реквизит3 -- 100;
ТипЗаписи -- Итог по группировке; Группировка -- Реквизит2; Реквизит1 -- 2; Реквизит2 -- 1; Реквизит3 -- 100;
ТипЗаписи -- Детальная запись; Группировка -- ; Реквизит1 -- 2; Реквизит2 -- 1; Реквизит3 -- 100;
Теперь внимательно.
Меняем порядок измерений в методе Выбрать:
Выбрать(ОбходРезультатаЗапроса.Прямой,"Реквизит2,Реквизит1",",Реквизит2");
Несмотря на другой порядок измерений итогов, мы получаем корректный результат:
ТипЗаписи -- Итог по группировке; Группировка -- Реквизит2; Реквизит1 -- NULL; Реквизит2 -- 2; Реквизит3 -- 10;
ТипЗаписи -- Итог по группировке; Группировка -- Реквизит1; Реквизит1 -- 1; Реквизит2 -- 2; Реквизит3 -- 10;
ТипЗаписи -- Детальная запись; Группировка -- ; Реквизит1 -- 1; Реквизит2 -- 2; Реквизит3 -- 10;
ТипЗаписи -- Итог по группировке; Группировка -- Реквизит2; Реквизит1 -- NULL; Реквизит2 -- 1; Реквизит3 -- 101;
ТипЗаписи -- Итог по группировке; Группировка -- Реквизит1; Реквизит1 -- 1; Реквизит2 -- 1; Реквизит3 -- 1;
ТипЗаписи -- Детальная запись; Группировка -- ; Реквизит1 -- 1; Реквизит2 -- 1; Реквизит3 -- 1;
ТипЗаписи -- Итог по группировке; Группировка -- Реквизит1; Реквизит1 -- 2; Реквизит2 -- 1; Реквизит3 -- 100;
ТипЗаписи -- Детальная запись; Группировка -- ; Реквизит1 -- 2; Реквизит2 -- 1; Реквизит3 -- 100;
Вопрос:
Когда происходит подсчет агрегатных значений при получении выборки?
При вызове метода Запрос.Выполнить() производится подсчет для всех всех вариантов порядка группировок в предложении ИТОГИ ПО <...>?
Либо итоги подсчитываются при вызове метода Выбрать(<....>)?
В таком случае на этом этапе должен производится анализ выражений языка запросов, потому что такой вариант, как
ИТОГИ СУММА(Реквизит3+Реквизит2*3)-10 КАК Реквизит3
также дает корректный результат.
С уважением, Анатолий
|
|