![]() |
![]() |
![]() |
|
Подсчет итогов в запросах при различном порядке измерений | ☑ | ||
---|---|---|---|---|
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 также дает корректный результат. С уважением, Анатолий |
|||
1
aleks_default
02.09.19
✎
14:43
|
Естественно в запросе. Метод выбрать ничего не агрегирует, только организует порядок обхода результата запроса
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |