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

Посмотрите на эту диаграмму, чтобы понять, с чем мы имеем дело:

Звучит уже как кошмар аналитика данных? Как зафиксировать все эти изменения и по-прежнему иметь возможность применять права доступа к данным, чтобы каждый человек видел свои собственные баллы, а если он менеджер — также должен видеть баллы, назначенные ему на основе результатов его команды? Помните, что организационная структура меняется каждый месяц, и количество уровней также может меняться.

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

Таблица "Сотрудник" и "Менеджер" одинаковы — сотрудник является своим собственным менеджером из-за будущих разрешений на данные (я объясню позже). Обе таблицы состоят из 2 столбцов: ID и Name.

Таблица истории сотрудников, например. В январе 2016 г., феврале 2016 г. он занимал должность руководителя группы, а в марте 2016 г. стал менеджером.

Таблица иерархии сотрудников, например. Менеджер 3 является начальником Руководителя группы 2 и Руководителя группы 3. Также является начальником Сотрудника 1, Сотрудника 2, Сотрудника 3 и Сотрудника 4. Все это в январе 2016 года.

Однако это изменилось в феврале 2016 года, когда Сотрудник 3 стал Менеджером и больше не принадлежит к иерархии Менеджера 3.

Что представляют собой столбцы в таблице иерархии сотрудников? Идентификатор начальника, Идентификатор менеджера, Идентификатор сотрудника, Дата, Уровень менеджера, Уровень сотрудника, Фильтр и Баллы.

Каждая строка представляет сотрудника и его начальника за каждый месяц, а также их текущий уровень и должность. Вы также должны ввести еще один столбец (S/O), который определяет, являются ли баллы баллами начальника или сотрудника — для будущей метрики MAQL.

Обратите внимание, что super_id состоит из employee_id, даты (месяц/год) и manager_id. Все это вместе позволит вам использовать права доступа к данным на уровне менеджера и сотрудника. Сотрудник может видеть только свои данные и баллы, потому что этот сотрудник является своим собственным «менеджером» и не имеет других людей в своей иерархии. С другой стороны Менеджер может видеть свои точки и точки людей в своей иерархии.

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

Фильтр должен присутствовать в следующих таблицах:История сотрудников, Иерархия сотрудников и Баллы.

Поздравляю! Мы официально готовы войти в проект GoodData и осуществить наши мечты!

Давайте углубимся в создание разрешения на доступ к данным:

Manager_id IN (4000000161) OVER super_id TO filter

Обратите внимание, что мы используем OVER TO, специальную MUF (охватывающую отношение M:N), описанную в Документации GoodData.

Вышеизложенное подготовит вас к финальной части — отчетности!

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

Очки Superior:

select sum(select (select sum(points) by filter) by super_id) where super_manager_id!=agent_id

Баллы сотрудника:

select sum(select (select sum(points) by filter) by super_id) where manager_name=agent_id and S/O=1

Думаешь, это все, что у нас есть для тебя? Подожди, еще нет!

Обычно ваша модель со временем становится больше, и в модель добавляются новые таблицы. Возьмем этот пример:

Есть 2 новые таблицы (Таблица 1 и Таблица 2), которые вы определенно собираетесь использовать в своих отчетах, верно? Если вы хотите увидеть «Очки Супериора» в разрезе Менеджера и что-нибудь из Таблицы 1/2, как вы это сделаете?

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

Однако почти всегда есть выход. Вот моя метрика:

select sum(points) where group IN (XY, XXY) AND (SELECT COUNT(super_id) BY filter, ALL OTHER WHERE super_manager_id!=agent_id) > 0

Атрибут Группа находится в таблице 1, атрибуты super_id в таблице баллов и атрибут Фильтр в таблице иерархии сотрудников.

Это позволит вам разделить отчет по любому элементу в таблице 1, таблице 2, таблицах иерархии «Менеджер», «Агент» и «Сотрудник».

Спасибо Мартину Матейке за его обмен знаниями!

Вопросы? Дайте нам знать!