Перейти к содержанию

Создание дашборда с динамическими столбцами в таблице

В данном подразделе показан пример настройки дашборда, содержащего виджет таблицы с динамическими столбцами.

Допустим:

  • на вашем дашборде уже размещена прямая или сводная таблица;
  • в таблице есть столбцы со значениями с разбивкой по годам;
  • вы хотите с помощью фильтра дашборда, вводя интервал, динамически изменять набор столбцов.

Показ дашборда в действии

  1. Вы задаёте интервал в фильтре.
  2. Введённые значения передаются в виджет «Число».
  3. В виджете «Число» формируется регулярное выражение для таблицы.
  4. Регулярное выражение через специальный фильтр подставляется в запрос таблицы как переменная.
  5. Таблица получает значение переменной и обновляется.

Схема передачи значений на дашборде

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

Описанный здесь принцип подходит для решения более сложных задач. Пример с датами взят для удобства.

Вам понадобится:

  • промежуточный технический виджет «Число» (и соответствующий запрос). Он будет хранить переменную для подстановки;
  • два поля ввода (текстовых фильтра) для задания границ интервала: левая граница входит в интервал, правая — не входит;
  • дополнительный технический фильтр. Он примет значение из «Числа» и применит его к таблице;
  • переменная в запросе таблицы.

Наполнение дашборда

Создайте запрос для регулярного выражения

Используйте следующий код:

SELECT concat(
          '^(',
          arrayStringConcat(
            arrayMap(x -> concat('__', toString(x)),
                     range(toUInt32({{start}}), toUInt32({{end}}))
            ),
            '|'
          ),
          ')$'
        ) AS regexp

Псевдоним после AS может отличаться от regexp, это некритично для получения результата.

В данном запросе используются переменные start и end. Чтобы проверить его работу, введите начало и конец интервала в поля ввода над запросом. В блоке результата вы должны увидеть регулярное выражение с перечислением лет. Правая граница не входит в интервал.

Двойное нижнее подчёркивание присоединяется к году как приставка и нужно, чтобы система отличала динамический столбец от обычного. Это позволяет автоматически располагать столбцы при выводе в порядке возрастания.

Если возникают проблемы с применением введённых значений, используйте Ctrl + Enter.

Проверка работы запроса для regexp

Выберите визуализацию «Число». Затем сохраните запрос в вашу коллекцию и добавьте на дашборд с таблицей.

Добавьте на дашборд текстовые фильтры

На предыдущем шаге вы вводили значения в поля ввода запроса. Теперь нужно обеспечить их инициализацию на дашборде. Для этого будут использоваться текстовые фильтры.

Также понадобится техническое поле, которое будет хранить значение регулярного выражения.

Добавьте на дашборд 3 текстовых фильтра:

  • поля ввода «с» и «по»;
  • список значений «regexp» (технический фильтр).

Названия ваших виджетов фильтра могут отличаться.

Задайте значения по умолчанию для «с» и «по», чтобы не получать ошибку при открытии дашборда.

Свяжите:

  • первое поле ввода «с» > start виджета «Число»;
  • второе поле вводе «по» > end виджета «Число».

Сохраните изменения.

Добавьте интерактивность для «Числа»

Необходимо обеспечить передачу регулярного выражения из «Числа» в поле технического фильтра.

Настройка интерактивности для виджета «Число»

Перейдите к редактированию дашборда. Наведите курсор на «Число», выберите «Поведение при нажатии». На появившейся панели справа выберите:

  • Обновить фильтр дашборда;
  • свяжите фильтр «regexp» со столбцом regexp;
  • активируйте «Применять по событию изменения значения»;
  • нажмите «Готово».

Сохраните дашборд.

Преобразуйте запрос таблицы в прямой

Из настроек виджета таблицы перейдите к запросу. Если он был составлен в конструкторе, потребуется преобразовать его в прямой запрос для возможности подстановки переменной в блок SELECT.

Далее вставьте в SELECT строку:

COLUMNS({{regexp}})

Ниже приведён пример запроса с подстановкой значения переменной. Вы можете использовать этот код, если у вас ещё нет таблицы для экспериментов.

WITH dataset AS (
    SELECT 'Отрасль A' AS "отрасль", 'Эмитент 1' AS "эмитент", 'Выручка' AS "показатель", 100 AS "значение_показателя", 2020 AS "год"
    UNION ALL SELECT 'Отрасль A','Эмитент 1','Выручка',120,2021
    UNION ALL SELECT 'Отрасль A','Эмитент 1','Выручка',150,2022
    UNION ALL SELECT 'Отрасль A','Эмитент 1','Выручка',170,2023
    UNION ALL SELECT 'Отрасль A','Эмитент 1','Выручка',200,2024
    UNION ALL SELECT 'Отрасль A','Эмитент 2','Выручка',80,2020
    UNION ALL SELECT 'Отрасль A','Эмитент 2','Выручка',90,2021
    UNION ALL SELECT 'Отрасль A','Эмитент 2','Выручка',110,2022
    UNION ALL SELECT 'Отрасль A','Эмитент 2','Выручка',130,2023
    UNION ALL SELECT 'Отрасль A','Эмитент 2','Выручка',140,2024
    UNION ALL SELECT 'Отрасль B','Эмитент 3','EBITDA',50,2021
    UNION ALL SELECT 'Отрасль B','Эмитент 3','EBITDA',60,2022
    UNION ALL SELECT 'Отрасль B','Эмитент 3','EBITDA',65,2023
    UNION ALL SELECT 'Отрасль B','Эмитент 3','EBITDA',70,2024
)

SELECT
    src."показатель",
    src."эмитент",
    COLUMNS({{regexp}})     -- расширяем только по годам, "г." не выводим
FROM (
    SELECT
        "показатель",
        "эмитент",
        maxIf("значение_показателя", "год" = 2020) AS "__2020",
        maxIf("значение_показателя", "год" = 2021) AS "__2021",
        maxIf("значение_показателя", "год" = 2022) AS "__2022",
        maxIf("значение_показателя", "год" = 2023) AS "__2023",
        maxIf("значение_показателя", "год" = 2024) AS "__2024",
        maxIf("значение_показателя", "год" = 2025) AS "__2025"
    FROM dataset
    GROUP BY "показатель","эмитент"
) AS src
ORDER BY src."показатель", src."эмитент";

В предварительном просмотре такого запроса будет ошибка до того момента, пока вы не введёте значение переменной. Чтобы увидеть все столбцы в предварительном просмотре, подставьте в поле ввода regexp: «.+».

AS "__2025": как уже отмечалось выше, двойные нижние подчёркивания являются признаком динамических столбцов таблицы.

Сохраните изменённый запрос. Вернитесь на дашборд.

Свяжите технический фильтр с таблицей

Настройка связи технического фильтра с таблицей

Перейдите к редактированию дашборда. Щёлкните по техническому фильтру regexp и свяжите его с вашей таблицей — столбцом regexp.

Сохраните дашборд.

Проверьте работу связки

Измените значения в полях виджета фильтра «с» и «по». Убедитесь в обновлении таблицы.

Вы можете щёлкнуть по «Числу» — первый щелчок применяет технический фильтр, второй — отменяет. Виджет таблицы может не отображаться, когда фильтр отменён, это не является ошибкой.

Скройте лишнее

Вы можете скрыть технический виджет «Число» и технический фильтр regexp в настройках дашборда.

Скрытие технических элементов

Сохраните настройки дашборда и ещё раз проверьте работу связки после скрытия технических элементов.

Теперь настройка завершена.

Дополнительные материалы