Добрый день.
Что-то я не могу понять как работает Aggr. Точнее я знаю как эта функция работает, ведь не раз уже использовал, но в данной конкретной ситуации, что-то не могу разобраться.
Есть такая таблица. (Выбран весь апрель 2017)
(https://qliksense-forum.ru/qvf/proxy.php?request=http%3A%2F%2Fi95.fastpic.ru%2Fbig%2F2017%2F0522%2F59%2Fbed58e3c7ba84fcb49c6c4e123ab5a59.png&hash=5512ca7c9ce8bcd0c35e155e058f5054dcc734ab)
Столбцы:
1) RowNo(Total) - мера, показыващая порядковый номер строки + так выводятся все строки на количество дней в выбранном периоде
2) Товар - тут всё понятно
3) ДатаКодОст - поле из календаря регистра для расчета остатков на лету.
4) Ост - остаток на дату =Sum({<$(eClearPeriod), $(eDateOst)>}[КолДвиж]*[ТипДвиж])
5) ДниНалич - признак положительного остатка на дату =If(Sum({<$(eClearPeriod), $(eDateOst)>}[КолДвиж]*[ТипДвиж])>0,1,0)
Переменные в set analisys, чтобы было более понятно
$(eClearPeriod) - убираем все выборки по периодам, чтобы они напрямую не влияли на набор данных [Год]=,[ГодМесяц]=,[ГодКвартал]=,[ГодНеделя]=,[Месяц]=,[Квартал]=,[Неделя]=,[Дата]=,[День]=,[ДеньНедели]=
$(eDateOst) - применяем выборку из основного календаря на календарь остатков, т.к. они не связанны на прямую [ДатаКодОст]=P({1<[ДатаКод]={">=$(=Min(Aggr(Min({<$(eClearRef)>} Total [ДатаКод]),[Товар])))<=$(=Max(Aggr(Max({<$(eClearRef)>} Total [ДатаКод]),[Товар])))"}>}[ДатаКод])
$(eClearRef)- убираем все выборки по справочникам, чтобы они напрямую не влияли на набор данных [Товар]=,[Аптека]=,[Партия]=
Теперь я просто хочу свернуть эту таблицу и получить просуммированые остатки по каждым дням и количество дней наличия. Всё казалось очень просто - использовать Aggr().
1) Для остатка Sum(Aggr(Sum({<$(eClearPeriod), $(eDateOst)>}[КолДвиж]*[ТипДвиж]),[Товар],[ДатаКодОст]))
2) Для дней наличия Sum(Aggr(If(Sum({<$(eClearPeriod), $(eDateOst)>}[КолДвиж]*[ТипДвиж])>0,1,0),[Товар],[ДатаКодОст]))
Но не тут то было. В полученной таблице всё по 0:
(https://qliksense-forum.ru/qvf/proxy.php?request=http%3A%2F%2Fi92.fastpic.ru%2Fbig%2F2017%2F0522%2F5f%2F53a2ae5c36a81dc2a83b542c70f7075f.png&hash=0fdf4954933bb492da5b8e3ca729a1aef502ae30)
Уже пару дней бьюсь над этой проблемой не могу понять почему так. Вроде просто обернул формулы мер в Aggr(), но результат не тот что ожидал.
В общем после упорнoго гугления выяснилось, что если во внутренней агрегации есть set analysis, то в большинстве случаем такой нужно указывать во внешней агрегации.
Т.е.
вместо
Sum(Aggr(If(Sum({<$(eClearPeriod), $(eDateOst)>}[КолДвиж]*[ТипДвиж])>0,1,0),[Товар],[ДатаКодОст]))
нужно было указать
Sum({<$(eClearPeriod), $(eDateOst)>} Aggr(If(Sum({<$(eClearPeriod), $(eDateOst)>}[КолДвиж]*[ТипДвиж])>0,1,0),[Товар],[ДатаКодОст]))