Добрый день,
Возник такой вопрос: необходимо просчитать среднее значение группировок в СКД.
Проблема в том, что среднее должно быть рассчитано на основе результата предыдущего уровня группировки.
Например
Среднее Значений бубликов
Регион 1 , а должно быть 4 - 8/на два сотрудника
Сотрудники
Иванов 3 - 1+1+1
Петров 5 - 1+1+1+1+1
Подниму старую тему. Должен же быть простой способ посчитать среднее по группе?
Накидал простой запрос.
ВЫБРАТЬ
1 КАК Зн,
"Гр1" КАК Изм,
"стр1" КАК Стр,
"ог1" как ОГ
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
1,
"Гр1",
"стр2"
,"ог2"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
1,
"Гр1",
"стр3"
,"ог2"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
1,
"Гр1",
"стр4"
,"ог2"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
10,
"Гр2",
"стр5"
,"ог2"
Показать
Ожидаю получить значения выделенные красным.
Даже если прописать ВычислитьВыражениеСГруппировкойМассив для всех группировок, общий итог считает не верно.
(5) Можно рассчитать всё запросом и в СКД только выводить нужные значения.
Вариант решения дубовый + лишние колонки, но так что бы понять суть алгоритма и на 1С можно было бы переписать.
(в верхнем подзапросе вместо av2, av3 надо указать, но картинку переделывать лень :-) )
Дерево обходится правильным образом рекурсией, но 1С рекурсию в запросах не поддерживает.
Пример рекурсии в SQL запросах приложил.
(6) Я для примера запрос кинул показать проблему. Так то все намного сложнее и в sql я запрос не прокину. В 1С оконные функции не завезли.
Только самому обходить результат и формировать ТЗ только остается?
(8) Нумерацию в 1С завезли. Если нужна нумерация по группам в 1С, то находишь минимальную в каждой группе и от текущего номера вычитаешь минимальный+1. Я специально дубовый пример с нумерацией привел, так как 1С это умеет. Когда не было нумерации в 1С соединяли таблицу саму с собой. То что возвращают оконные функции можно реализовывать в стандарте SQL-92. Долго, много писанины, плохая читабельность сути алгоритма, но можно.
Тут самое главное, это свойство функции AVG() не включать в расчет среднего значения NULL.
Есть и другие алгоритмы. Например, средний можно считать ручками как sum()/count() или sum()/sum() в сочетании с iif(<условие>, 1, 0).
sum(iif(<условие>, 1, 0)) as s1