Типы данных для построения виджетов
При написании SQL-запросов важно понимать тип значения, возвращаемого из ClickHouse, так как это определяет, как данные будут интерпретированы и как их можно будет визуализировать и форматировать для конечного пользователя.
Важно: определенные типы данных могут быть получены в результате запроса тремя способами.
- Простая выборка данных: напрямую выбирать значения из таблиц #tasks или #events;
- Приведение данных: приведение данных: явное приведение данных к нужному типу в самом SQL-запросе.
- Агрегация данных: выполняется с помощью агрегирующих функций, таких как COUNT, SUM, AVG и других.
Типы данных для SQL-запросов
Числовой тип
Числовые типы используются для расчетов, агрегаций и построения оси Y (значений) на графиках.
Числовые типы данных в Pyrus представлены в ClickHouse следующими типами: Int8, Int16, Int32, UInt32, Int64, Nullable(Int64), UInt64, Float64, Nullable(Float64).
Поле типа Деньги
Пример: в форме для ведения продаж есть поле типа Деньги с кодом ${Деньги}, в котором менеджеры указывают сумму заключённой сделки. Нам необходимо определить, сколько открытых задач приходится на каждую сумму сделки.
SELECT
${Деньги} AS "Сумма сделки",
COUNT(task_id) AS "Количество задач"
FROM #tasks
WHERE is_closed = false
GROUP BY ${Деньги}
ORDER BY ${Деньги}
LIMIT 100;

Подсказка: вместо кода поля ${Деньги} можно использовать иные поля числового типа, при этом отображаться на графике будут строго числовые значения, например ${Число}, ${Контакт}, responsible_id, step и другие.
Поле типа Контакт
Пример: в форме Обработка заявок клиентов есть поле типа Контакт с кодом ${Ответственный}, в котором указывается сотрудник, назначенный ответственным за выполнение заявки. Мы хотим увидеть загрузку сотрудников: сколько активных заявок приходится на каждого ответственного.
Поле типа Контакт возвращает ID пользователя. Чтобы вместо цифр увидеть имя сотрудника, используем параметры форматирования #person_full_name.
SELECT
${Ответственный} AS "#person_full_name('Ответственный')",
COUNT(task_id) AS "Количество задач"
FROM #tasks
WHERE is_closed = false
GROUP BY ${Ответственный}
ORDER BY COUNT(task_id) DESC
LIMIT 100;
Подсказка: вместо кода поля ${Ответственный} можно использовать системные поля: responsible_id (текущий ответственный), creator_id (автор задачи) и другие.
Поле типа Выбор
Пример: в форме Help Desk есть поле типа Выбор*» с кодом ${Канал}, в котором оператор указывает, откуда пришло обращение: электронная почта, звонок, чат или мессенджер. Мы хотим увидеть, какие каналы приносят больше всего открытых обращений.
По умолчанию все значения поля типа Выбор являются числовыми (ID вариантов). Чтобы в отчёте отображались названия каналов, а не цифры, используем псевдоним #choice_name, где Канал обращения — название колонки в таблице, а ${Канал} — код поля типа Выбор в форме.
SELECT
${Канал} AS "#choice_name(${Канал},'Канал обращения')",
COUNT(task_id) AS "Количество задач"
FROM #tasks
WHERE is_closed = false
GROUP BY ${Канал}
ORDER BY COUNT(task_id) DESC
LIMIT 100;

Обратите внимание: индексы [N] и [*] позволяют обращаться к конкретному значению поля: [N] обращается к N-му выбранному элементу, а [*] — ко всем элементам массива.
Поле типа Форма
Пример: в форме Проекты есть поле типа Форма с кодом ${Форма}, через которое к проекту прикрепляется задача из формы Договоры. Мы хотим увидеть, на какие договоры приходится наибольшее количество активных проектов.
По умолчанию значения поля типа Форма — числовые ID задач. Чтобы вместо ID видеть название договора и ссылку на него, используем псевдоним #task, где Заголовок — наименование столбца в таблице, а ${Форма} — код поля типа Форма.
SELECT
${Форма} AS "#task('Заголовок')",
COUNT(task_id) AS "Количество задач"
FROM #tasks
WHERE is_closed = false
GROUP BY ${Форма}
ORDER BY COUNT(task_id) DESC
LIMIT 100;

Обратите внимание: индексы [N] и [*] позволяют обращаться к конкретному значению поля: [N] обращается к N-й выбранной задаче, а [*] — ко всем задачам.
Дата и Время
Формат Дата и Время используется для построения графика типа Временной ряд.
Дата и Время в Pyrus представлены в ClickHouse следующими типами: DateTime64(3, 'UTC'), Nullable(DateTime64(9, 'UTC')).
Пример: посмотрим, как распределены открытые и закрытые задачи для значений поля типа Дата и Время в заданном интервале времени.
В отчёте должны отображаться все задачи, в которых есть заполненное поле с кодом ${Дата} и указаны Дата начала и дата окончания события или процесса.
Пример:
SELECT
DATE(${Дата}) AS "Пользовательская дата",
COUNT(task_id) FILTER (WHERE is_closed = false) AS "Открытых задач",
COUNT(task_id) FILTER (WHERE is_closed = true) AS "Закрытых задач"
FROM #tasks
WHERE ${Дата} >= @period_start AND ${Дата} <= @period_end
GROUP BY DATE(${Дата})
ORDER BY DATE(${Дата})
LIMIT 100;

Подсказка: вместо поля с кодом ${Дата} можно использовать коды других полей типа Дата и Время, например due_date, create_date, или код поля типа Время.
Логический тип
Используется для формирования логических выборок по условиям запроса. Логический тип данных представлен в ClickHouse типами Bool и Nullable(Bool).
Поле типа Галочка
Пример: отсортируем задачи по выбранному значению в поле Галочка, выведем значение поля типа Галочка. ${Галочка} — код поля типа Галочка в форме Pyrus.
SELECT
${Галочка} AS "Значение галочки",
COUNT(task_id) AS "Количество задач"
FROM #tasks
WHERE is_closed = false
GROUP BY ${Галочка}
ORDER BY COUNT(task_id) DESC
LIMIT 100;

Текстовый тип
Используется для именования данных на графиках или для отображения значений в таблицах.
Текстовый тип данных представлен в ClickHouse типом Array(Nullable(String)).
Поле типа Текст
Пример: в форме Help Desk есть два текстовых поля: ${Тема} — для краткого описания сути обращения отправителем, и ${Сообщение} — для подробного изложения проблемы, которую необходимо решить службе поддержки. Мы хотим вывести список последних обращений с темами и текстами сообщений.
Поле типа Текст возвращает введённую строку.
SELECT
task_id AS "#task('Задача')",
${Тема} AS "Тема",
${Сообщение} AS "Сообщение"
FROM #tasks
WHERE is_closed = false
AND ${Тема} IS NOT NULL
ORDER BY create_date DESC
LIMIT 20;
Поле типа Телефон
Пример: в форме Help Desk есть поле типа Телефон с кодом ${Телефон}, в котором указывается номер телефона отправителя для обратной связи. Мы хотим вывести список последних обращений с указанием номеров телефонов.
Поле типа Телефон возвращает введённый номер в текстовом виде.
SELECT
task_id AS "#task('Задача')",
${Телефон} AS "Телефон"
FROM #tasks
WHERE is_closed = false
AND ${Телефон} IS NOT NULL
ORDER BY create_date DESC
LIMIT 20;
Поле типа Эл. почта
Пример: в форме Help Desk есть поле типа Эл. почта с кодом ${Эл. почта}, в котором указывается адрес отправителя. При необходимости в это поле можно ввести несколько адресов через запятую (например, если письмо было отправлено с нескольких адресов или переслано). Мы хотим выводить в отчёте как первый адрес из списка, так и полный перечень всех адресов.
Поле типа Эл. почта возвращает введённый адрес почты в текстовом виде.
SELECT
task_id AS "#task('Задача')",
${Эл. почта} AS "Первый адрес",
${Эл. почта[*]} AS "Все адреса"
FROM #tasks
WHERE is_closed = false
AND ${Эл. почта} IS NOT NULL
ORDER BY create_date DESC
LIMIT 20;
Поле типа Справочник
Пример: рассчитаем число открытых HR-службой задач так, чтобы они группировались по категориям в зависимости от типа подписываемых документов (согласно значениям поля типа Справочник). Также мы хотим, чтобы в отчёте отображалось название документа — текстовое значение выбранного поля.
В отчёте по SQL-запросу поля типа Справочник возвращают текстовые значения выбранной строки справочника для каждой задачи. Извлечем значения из третьей колонки справочника с кодом ${Справочник}. В этой колонке перечислены типы кадровых документов согласно приказу Минтруда РФ № 578Н.
SELECT
${Справочник[3]} AS "Код документа по 578Н",
COUNT(task_id) AS "Количество задач"
FROM #tasks
WHERE is_closed = false
GROUP BY ${Справочник[3]}
ORDER BY COUNT(task_id) DESC
LIMIT 100;

Обратите внимание: если поле в задаче не заполнено, запрос может вернуть null, если вы не хотите учитывать задачи, в которых это поле не заполнено, добавьте в запрос WHERE ${Поле} IS NOT NULL.
Индексы [N] и [*]: [N] обращается к значению N-й колонки первого выбранного элемента, а [*] возвращает массив всех выбранных элементов, где каждый элемент — массив значений его колонок (${Справочник[*]}).
Обзор типов визуализации
После того как вы убедились, что в SQL-запросе возвращены все необходимые данные в правильном формате и количестве, вы можете настроить их отображение, выбрав тип виджета.
Важно: выбор типа диаграммы определяет, какие форматы данных (Число, Дата и Время, Логический тип) будут ожидаться от вашего SQL-запроса для корректной работы осей диаграммы.
Таблица (формат по умолчанию)
Таблица является форматом по умолчанию и наиболее универсальным, так как она отображает все возвращенные данные без агрегации, свойственной графикам.
Требования к запрашиваемым данным
Допустимы любые типы данных. Каждая именованная переменная (колонка) в вашем запросе (
SELECT Col_A, Col_B) создаст отдельный столбец в отображаемой таблице.
Настройка отображения таблицы
- Переименование данных: используйте псевдонимы в
SELECT AS. - Группировка: позволяет имитировать иерархическое представление данных.

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

Настройка отображения
Необходимо вручную указать, какая колонка из результатов запроса соответствует Значению (размер сектора) и какая — Названию.
При наведении курсора отображается название сектора и его точное числовое значение.

Подсказка: если вы хотите, чтобы виджет отображал только круговую диаграмму, установите в чекбоксе галочку Скрывать таблицу.
Столбчатая диаграмма
Используется для прямого сравнения дискретных данных. Поддерживает отображение нескольких рядов данных.
Требования к запрашиваемым данным
Колонка(и) значений (Ось Y): тип данных — Число. Доступно для выбора несколько наборов данных.
Колонка названий (Ось X): может быть представлена любым типом данных.

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

Подсказка: воспользуйтесь настройкой Скрывать таблицу, чтобы скрыть отображение таблицы с данными.
Временной ряд
Временной ряд отображает последовательность значений, привязанную к Дате. Это ключевой инструмент для анализа трендов.
Требования к данным
Колонка времени (Ось Х). Ожидаемый формат данных — Дата и время.
Колонка значений (Ось Y). Ожидаемый формат данных — Число.

Настройка отображения
Необходимо вручную указать, какая колонка из результатов запроса соответствует времени и какая — значению.
При наведении курсора отображается выбранные значения по обеим осям.

Подсказка: воспользуйтесь чекбоксом Скрывать таблицу, чтобы скрыть отображение таблицы с данными.
Типы форматирования осей
То, как будут выглядеть данные отчёта на диаграмме, зависит от типа данных, который вы выбрали в запросе.
Числовые типы
При отображении числовых типов данных доступны следующие варианты форматирования:
- по умолчанию: используются параметры, заданные в поле формы;
- проценты: для отображения долей;
- минуты / секунды: для удобного отображения временных интервалов;
- деньги: отображается с учетом того, какая валюта указана в поля Деньги в форме.
Дата и Время
Данный тип форматирования отвечает за то, какая часть временной метки будет показана на графике или в таблице.
- Дата и время: полная метка (DD.MM.YYYY HH:MM).
- Дата: только календарная дата (DD.MM.YYYY).
- Время: только время суток (HH:MM).
Форматирование иных типов данных не предусмотрено.