Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
millik89
Contributor II
Contributor II

Подсчитать кол-во выданных карт до даты

Добрый день.

Такая ситуация. Есть таблица карточек лояльных клиентов, в ней есть поле ДатаВыдачи. Нужно сделать график на котором отображается кол-во выданных карточек до определенной даты. В качестве измерения выбрана группа из полей таблицы Календарь.

Эти две таблицы связаны через таблицу чеков.

схема.png

Теперь о выражении.

Я составил следующее выражение:

= COUNT({1< ДатаВыдачи# = {" <=$(=MAX(Дата#))"}>}DISTINCT КартыАЙДИ)

Если его прописать в обычном текстовом объекте, то делая выборку полей таблицы календарь все нормально - оно как и положено подсчитывает количество выданных карт до выбранной даты/месяца/года и т.п.

Но вот когда я его вставляю в график, то получаю совсем не то что нужно. Может это выражение не подходит для графика?

Буду очень благодарен за любую помощь.

5 Replies
Sergey_Polekhin
Employee
Employee

А что именно "не то что нужно": по какому измерению строите график и что не устраивает?

Помимо ответа на вопрос выше, рекомендую убрать лишние пробелы (не могу проверить их наличие в реальной формуле, но если формулу в вопрос выше вы вставляли как copy/paste, то они там явно есть) в строке поиска в модификаторе, заключенной в двойные кавычки.

millik89
Contributor II
Contributor II
Author

1) Пробела в выражении нет, это я в сообщении добавил почему-то.

2) График строю по группе в которую входит 3 полей "Дата, МесяцГод, Год". График находится в отдельном состоянии (если я правильно применил термин), т.е. никакие выборки на него не влияют

3) Если я правильно понял, то график выводит кол-во карт по которым совершались покупки в выбранном периоде. Выражение =COUNT(DISTINCT КартыАЙДИ) выводит такие же результаты.

Sergey_Polekhin
Employee
Employee

По 1) и 2) - ок.

По 3) - диаграмма (график или таблица) всегда рассчитывает заданное выражение по отношению к КАЖДОМУ элементу измерения.

Поэтому описывая выражения в объектах нужно всегда задумываться о контексте вычислений. Например:

  • Текстовый объект сам по себе не создает дополнительного контекста - в нем измерения отсутствуют, поэтому расчет всегда ведется по всему множеству данных. И при необходимости изменения множества данных по которым ведется расчет, вы просто определяете его модификатором множества.
  • Любая диаграмма (таблица или график), как правило, содержит некоторые измерения. Поэтому вычисления выражений всегда проводятся в контексте заданных измерений. Т.е. на первом этапе в заданном выражении, на основе указанных в нем модификаторов множества, строится множество значений, для которых будет рассчитываться выражение. На втором этапе это выражение рассчитывается в контексте каждого набора измерений, заданного в диаграмме. На третьем этапе полученная таблица значений - визуализируется.

Исходя из сказанного выше, нужно просто понять исходную задачу и подумать - как ее лучше визуализировать.

millik89
Contributor II
Contributor II
Author

Спасибо за подсказку. Буду думать в заданном направлении.

Anna_Klimkova
Employee
Employee

 

 

Поле КартыАЙДИ у вас является ключом и присутствует в нескольких таблицах.

 

QlikView не должно догадываться из какой таблицы вы хотите подсчитать количество карт.

Поэтому хорошим тоном считается не использовать ключи в формулах (они нужны для связи таблиц), а создавать в скрипте отдельные поля для расчетов,

 

например: в таблице Дисконтные карты добавьте строку

 

КартыАЙДИ as КартыАЙДИВыдача,

 

Для диаграммы по количеству выданных карт по месяцам будет достаточно формулы

 

Count(КартыАЙДИВыдача).

 

Ограничить по дате можно не только в выражении, но и сделав вычиcляемое измерение с условием if().

 

 

Если бы у нас была только таблица Чеки и надо было найти количество новых клиентов (карт) за каждый месяц, то тогда лучше использовать фунцию aggr():

 

sum(aggr(if(monthstart(min(Total  <КартыАЙДИ> Дата))=МесГод,1,0), КартыАЙДИ,МесГод))