FAQ по формулам, в т.ч. измерениям, в Qlik Sense/Qlik View часть 2

Q: Есть в одной таблице:
Дата, Выручка, Остаток
Не по всем дням есть остаток, т.е. был дефицит
Например из 30 дней в месяцев, остатков когда товара не было в наличие было 3 дня
Как рассчитать количество дней, когда остатков было = 0
?
A:Можно пойти от обратного.
Посчитать количество дней итого или вручную за период используя переменные и затем отнять количество дней когда товар был на остатках… примерно так:
count (Distinct Дата) — count (Distinct {< Остаток = {'>0′}>} Дата )
вместо count (Distinct Дата) можно использовать так: num(max(Дата)) — num(min(Дата))

Q:Количество случаев — Count(N_ZAP)
Сумма — Sum (Total [Количество случаев]) результат 0

A:Count(total <КСГ> N_ZAP)
http://help.qlik.com/ru-RU/qlikview/12.1/Subsystems/Client/Content/ChartFunctions/define-aggregation-scope.htm

Q:Есть 2 таблицы:

1. Дата, Артикул, Сумма продаж
2. Дата, Артикул, Сумма остатков

Если суммирую продажи на одном графике, то выводится сумма продаж за месяц.
Какой функцией на втором графике выводить не сумму остатков, а только остатки зна последний день данного месяца (или на первый)

?

A:Если у вас есть остатки на каждый день или на каждый последний день месяца, то их можно выводить вместе с данными по месяцам используя флаг рассчитанный на конец месяца, т.е. в календаре добавляем поле :
Код:
if(num(DateId)=num(floor(monthend(DateId))),1,0) as EOM_Flag,
а в графике или таблице где измерение = месяц в выражении пропишем:
Код:
sum({} СуммаПродаж)

Q:Что-то я не могу понять как работает Aggr. Точнее я знаю как эта функция работает, ведь не раз уже использовал, но в данной конкретной ситуации, что-то не могу разобраться.

Есть такая таблица. (Выбран весь апрель 2017)
Столбцы:
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:
http://i95.fastpic.ru/big/2017/0522/59/bed58e3c7ba84fcb49c6c4e123ab5a59.png
http://i92.fastpic.ru/big/2017/0522/5f/53a2ae5c36a81dc2a83b542c70f7075f.png
A:
В общем после упорнoго гугления выяснилось, что если во внутренней агрегации есть set analysis, то в большинстве случаем такой нужно указывать во внешней агрегации.

Т.е.
вместо
Код: [Выделить]
Sum(Aggr(If(Sum({<$(eClearPeriod), $(eDateOst)>}[КолДвиж]*[ТипДвиж])>0,1,0),[Товар],[ДатаКодОст]))
нужно было указать
Код: [Выделить]
Sum({<$(eClearPeriod), $(eDateOst)>} Aggr(If(Sum({<$(eClearPeriod), $(eDateOst)>}[КолДвиж]*[ТипДвиж])>0,1,0),[Товар],[ДатаКодОст])

Q:Я новичок в освоении qlik, завалился кучей информации и не много «поплыл».
Не могу разобраться, как мне кажется, с элементарным вопросом.
Извиняюсь, если данная тема была на форуме, я не нашел решения.

Как посчитать сумму продаж на определенную дату с начала года?
Насколько я понимаю, нужно использовать функцию InYearToDate.
Кажется, конструкция выглядит так : sum(if (InYearToDate (OrderDate, BaseDate, 0), TotalSales)), но я не совсем понял что вписать вместо BaseDate… какую дату? нужна ли переменная ?

A:Хорошо бы увидеть модель данных, — в частности интересует, как устроен календарь.
Полагаю, что в любом случае лучше будет использовать Set Analysis.
Рекомендую почитать статейку о том, как можно выстраивать и использовать время в модели. Вложил.

Также, подход к решению задачи будет зависеть от того, какой конкретный отчет требуется получить.
На вкладке «Выражения» свойств диаграмы есть опция рассчитывать выражение накопительно. В ряде случаев этого может быть вполне достаточно.

Q: Есть таблица: «Выручка за месяц», «Выручка за месяц», «Количество транзакций».
На лист устанавливаю объект «Текст и изображение», там пишу функцию Above([Выручка за месяц], 1). Отображается пустота, почему?
Пробовал так: {<Месяц={$(=Max(Месяц)-1)}>} [Выручка за месяц] тоже пустота.

Что я делаю не так?

A: Объект текст выводит результат выражения по всей выборке и не производит расчетов по измерениям.
Если цель выдать показатель именно таким образом, следует использовать Aggr().
Но для отладки рекомендую начать с таблицы, в объекте диаграмма.

Q: Сделал в таблице вывод «месяц, год»
month(CREATEDAT) & ‘ ‘ & year(CREATEDAT)

Почему то за сен, окт, ноя 2016 года оказались в низу списка, выше пошли июл 2011 и наст. времени.

в таблице с выводом полной даты все нормально. Что может быть?

A:
Все верно, сортировка текстом не даст ожидаемого результата.
Используйте функцию dual().
Например,
Код:
dual(month(DateId) & ‘-‘ & year(DateId),year(DateId) & num(month(DateId), ’00’)) as ‘Месяц-год’,

Q: Никак не могу справиться с такой задачей.
Есть сущность — контекст. В нем могут быть входящие и исходящие вызовы.
Т.е. имеем Контекст и в нем
Call ID,Направление.

Направления может иметь такие значения:
Вход (усп)
Исх (усп)
Исх (не усп)
Вход (не усп)

Необходимо посчитать число вызовов для контекстов, в которых есть только исходящие вызовы

A: ОК, возможны два варианта.
Либо в скрипте подготовить массив для контекста с флагам по направлениям.
Либо написать выражение с вложенным анализом множеств.
Хелп по ссылке

Я бы сделал два варианта и сравнил бы их по производительности на больших массивах данных.

Q: Во вложении пример Диаграмма (Сводные таблицы). Одна и та же, но
1. В развернутом по Месяцу
2.В свернутом по Месяцу виде

Задача Посчитать количество сработок Клиента за месяц, т.е. при сворачивании по месяцу должно получиться 5 (как в верхней таблице), а не 1 как сейчас.

Пробовал воспользоваться Aggr, необходимого результата не получил

A: Продублируйте первую таблицу в Aggr() и возьмите сумму по полученной таблице(по полученным значениям):
Sum(Aggr(Count({$<[Сумма]={">0″}>} [Партнер_ID]), Партнер, Филиал, Месяц-Год,День))

(возможно ли что к названию партнера привязано несколько id?)

Q: У меня ситуация следующая. Есть отчет, если проще то группа, в ней энное количество товара. Далее за выбранный период отображаются в сводной таблице сколько продалось товара, и остаток только на товар где продаж больше нуля. Реализовано функцией IF() продажи больше чем ноль то остаток показываем, если меньше или равно нулю, то остаток показываем ноль. А в настройках стоит, что позиции с нулевым выражением скрываем. Проблема в том, что итоги показывают остаток больше, так как итог сначала суммирует общее количество продаж и только потом проверяется функция IF().
Можно как-то заставить итог по остаткам отображать правильную сумму?

A: Вместо If пользуйтесь анализом множеств ( на эту тему сегодня новая статья вышла)
Попробуйте
sum({<[#Сумма]={'>0′}>} [#Сумма остатка])

Q: Есть задача:
Массив данных: Группа товара, товар, Сумма, Кол-во.
Вывести в одной таблице товар который в сумме дает 50% от итога (наибольших) по сумме
и вторая половина 50% (наименьших) по сумме.

A: подробнее можно было бы написать с подробным примером.
Надо использовать выражение типа
Код:
If(RangeSum(Above(Sum(Sales),0,RowNo()))/Sum(TOTAL Sales) <= 0.8,Sum(Sales)) и читать https://community.qlik.com/blogs/qlikviewdesignblog/2014/09/15/abc-analysis https://community.qlik.com/message/1152541#1152541 Q: В Qlik Sense подгружены плановые показатели по дням за текущий месяц (за все дни текущего месяца). Если сегодня 9 число, то надо посчитать сумму по Плану за 9 дней, если 10 число, то за 10 дней и т.д. Подскажите, пожалуйста, как это сделать?

A: Вариантов на эту тему существует несколько.
Самый простой для начинающих, создать флаговое поле в скрипте на все даты от начала месяца до текущей даты, скажем MTD равный 1 для нужных дат и составить выражение:
Код:
sum( {} План)
или не создавая поля
Код:
sum({=$(=MonthStart(Today()))<=$(=Today())'}>}План)
Но в этом случае приложение будет зависить от дня просмотра, есть еще несколько вариантов и смысл у всех один — использование фильтра, т.н. «Set analysis and set expressions»

Q: столкнулся со следующей проблемой в применении aggr, по которой прошу вашего подсказа или ссылки на источник информации для решения.

1. Aggr(sum(выражение), Номенклатура).
2. Действует (и имеет значение) выборка месяца.
3. Выражение строится на сет анализе, «отменяющем» действие выборки, — для позиций номенклатуры вычисляются некие значения(продажи предыдущих — за пределом выборки — периодов).
4. Аггрегирую по номенклутуре для того, чтобы получить значения для склада.

Насколько я могу судить, aggr вычисляет Null для позиций, которые не продавались в текущем месяце и отрезаны, тем самым, выборкой по месяцу. Такое может быть? Или все же мне надо разбираться с выражением?

Написал максимально общо, поскольку предполагаю, что ответ все-таки на поверхности. Если не так — запощу модель.

A: Из последнего руководства по Qlik Sense
ALL qualifier

In QlikView, the ALL qualifier may occur before an expression. This is equivalent to using {1} TOTAL. In such a case the calculation will be made over all the values of the field in the document, disregarding the chart dimensions and current selections. The same value is always returned regardless of the logical state in the document. If the ALL qualifier is used, a set expression cannot be used, since the ALL qualifier defines a set by itself. For legacy reasons, the ALL qualifier will still work in this version of Qlik Sense, but may be removed in coming versions.

http://help.qlik.com/en-US/sense/3.1/Subsystems/Hub/Content/Scripting/functions-statements-not-recommended.htm

Q: Необходимо посчитатьCall ID только для тех у которых
— код завершения =503
— отношение числа Call ID к числу код завершения=503 >10

Вероятно криво делаю так
=if(Count ([Call ID])/Count ([код завершения]=503)>10 ,count(if([код завершения]=503, [Call ID])))
В итоге не получаю данных для отображения, хотя они должны быть.

A: Советую изучить такую чудесную вещь как Set Analysis

Поле «для тех у которых» заменим словом «Объект» =)

Не совсем понял условия но должно быть что-то вроде этого
Код:
Count( {$<[код завершения]={'503'}, [Объект]={"=Count ([Call ID])/Count({$<[код завершения]={'503'}>}[Call ID])>10″} >} [Call ID])

Получаем следующее:
1) [код завершения]={‘503’} — мы делаем выборку по коду завершения, соответственно в массив данных для обработки попадают только те объекты у которых в принципе есть вызовы с таком кодом завершения
2) [Объект]={«=Count ([Call ID])/Count({$<[код завершения]={'503'}>}[Call ID])>10″} — мы для каждого объекта считаем отношение общего количества Call ID к количеству Call ID с кодом завершения=503, и оставляем только те объекты у которых это отношение больше 10

ПС
Возможно я не очень правильно представил себе модель данных и условия. Но общий ход мыслей должен быть ясен.

Q: Создана родительско-дочерняя таблица с помощью функции Hierarchy.
Задача состоит в том, чтобы в сводной таблице иметь возможность раскрыть созданное дерево, при этом чтобы значения показателей на различных уровнях не суммировались (значения не аддитивные).
Пробовал через sum() и only(), не вышло.

Почему не в объекте «список» в виде дерева — множество атрибутов, цветовое кодирование, сортировка и т.д.

A: Решил с помощью dimansionality()
который фактически совпадает с длиной нода в дереве (NodeDepth)

Найти решение у бизнес-партнера QlikTech (QlikView) в России.

Форум разработчиков QlikView и Qlik Sense. Получите ответы на все вопросы по QlikView и Qlik Sense!

Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий

67 queries in 0,191 seconds