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

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

Non Comparative Dates Image

Создание синтетического измерения

Для решения этой задачи я использовал синтетические измерения. Синтетическое измерение означает нечто такое, чего не существовало до загрузки данных. Для работы с этими измерениями есть две функции. ValueList() и ValueLoop(). Для того чтобы создать измерения для этой таблицы, я использовал сначала ValueList():

1 ValueList(‘Month 1’, ‘Month 2’, ‘Month 3’) // и т.д.

Так, у нас получится диаграмма с тремя измерениями, которые называются Month 1, Month 2 и Month 3. Идем дальше, используем функцию ValueLoop() внутри ValueList(). Синтетическое измерение может быть сгенерировано динамически, на основе наших данных:

1 LET mySynthDimension = Concat(chr(39)&’Month ‘&Valueloop(1,$(DimensionCount))&chr(39), ‘,’,Valueloop(1,$(DimensionCount)));
2 // The DimensionCount variable would be based on a count of another *real* dimension, eg getPossibleCount(Months)

Функция ValueLoop() встроена в concat(). Так, я создал синтетическое измерение mySynthDimension, к которой мы можем обратиться внутри ValueList(), когда мы готовы его использовать.

Creating a Synthetic Dimension in the Create Dimension Dialogue Box

Теперь пойдем далее к созданию выражений.

Создание выражений

Мы используем в этом случае прямую таблицу. Для корректного отображения данных в таблице, нам нужно создать два выражения:

1 SUM({$<WeekSerial={‘$(=Min(MonthSerial))’}>}Sales) // Current Period
2 SUM({[Prior]<WeekSerial={‘$(=Min(MonthSerial))’}>}Sales) // Prior Period

Назначение итогов корректных синтетических ключей

А теперь назначим метрики соответствующему измерению. В нашем примере получится в таком виде:

1 IF(ValueList(‘Month 1′,’Month 2′,’Month 3’) = ‘Month 1’
2   ,’In Month 1 bucket’
3   ,IF(ValueList(‘Month 1′,’Month 2′,’Month 3’) = ‘Month 2’
4     ,’In Month 2 Bucket’
5     ,IF(ValueList(‘Month 1′,’Month 2′,’Month 3’) = ‘Month 2’
6     ,’In Month 3 Bucket’
7     )))

Теперь добавим еще несколько строк кода с функцией Pick(Match()):

1 pick(
2   match(‘Month ‘&RowNo()
,’Month 1′,’Month 2′,’Month 3′)
3 ,’In Month 1 Bucket’,’In Month 1 Bucket’,’In Month 1 Bucket’)

Этот код более компактный и читаемый.

Задаем динамику: параметризированное выражение доллара

Теперь у нас есть измерение и выражения, которые мы можем использовать. А теперь используем знак доллара с параметрами. Теперь используем те же выражения, но с переменными:

1 SET vCurrentPeriodSales = ‘SUM({$<WeekSerial={“$(=Min(MonthSerial)+$1)”}>}Sales) // Current Period
2 SET vPriorPeriodSales   = ‘SUM({[Prior]<WeekSerial={“$(=Min(MonthSerial)+$1)”}>}Sales) // Prior Period

Обратите внимание на $ в коде. Это позволяет обработать данные в нашей переменной:

1 =$(vCurrentPeriodSales(24))  // would run an expression like this SUM({$<WeekSerial={“$(=Min(MonthSerial)+24)”}>}Sales)

Создаем полностью динамическое выражение, которое отвечает выборкам пользователей:

1 Pick(
2    Match(
3      ‘Month ‘&RowNo()
4 ,$(vFlexiChartDimensions)
5    )
,
6      $(=Concat(chr(36)&'(‘& vCurrentPeriodSales &'(‘&Valueloop(0,DimensionCount)&’))’, ‘,’,Valueloop(0,DimensionCount))
7    )

Когда код запускается, то получается так:

1 Pick(
2     Match(
3       ‘Month ‘&RowNo()
4 ,’Month 1′,’Month 2′,’Month 3′
5     )
,
6       $(vFlexiChartDimensions(1)),$(vFlexiChartDimensions(2)),$(vFlexiChartDimensions(3))
7     )

 

Вот и все на сегодня!

Хороших вам Qlik-разработок.