Представьте себе организационную структуру, которая меняется каждый месяц. Начальник внезапно становится сотрудником и наоборот. Каждый человек получает определенное количество баллов в зависимости от его производительности, и такое же количество получает его менеджер и начальник менеджера.
Посмотрите на эту диаграмму, чтобы понять, с чем мы имеем дело:
Звучит уже как кошмар аналитика данных? Как зафиксировать все эти изменения и по-прежнему иметь возможность применять права доступа к данным, чтобы каждый человек видел свои собственные баллы, а если он менеджер — также должен видеть баллы, назначенные ему на основе результатов его команды? Помните, что организационная структура меняется каждый месяц, и количество уровней также может меняться.
Самая большая проблема, с которой вы сталкиваетесь сейчас, — это модель и права доступа к данным в 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, таблицах иерархии «Менеджер», «Агент» и «Сотрудник».
Спасибо Мартину Матейке за его обмен знаниями!
Вопросы? Дайте нам знать!