На одном из текущих проектов мне нужно было найти способ группировки данных из двух альтернативных состояний в единой таблице.
В моем примере временные периоды всегда будут в сопоставительном формате (недели или месяцы), но приложение сравнивает любой временной период с любым временным периодом. Это управляется простой настройкой анализа множеств.
Создание синтетического измерения
Для решения этой задачи я использовал синтетические измерения. Синтетическое измерение означает нечто такое, чего не существовало до загрузки данных. Для работы с этими измерениями есть две функции. 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(), когда мы готовы его использовать.
Теперь пойдем далее к созданию выражений.
Создание выражений
Мы используем в этом случае прямую таблицу. Для корректного отображения данных в таблице, нам нужно создать два выражения:
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-разработок.
Свежие комментарии