Создание матрицы подсчетов с.master-списком

Вопрос или проблема

У меня есть три таблицы.

Первая таблица называется REPORTS_MASTER_LIST, она содержит столбцы REPORT_NAME, REPORT_CATEGORY. В ней находятся все отчеты, которые могут быть выполнены пользователями, и их категории.

Вторая таблица называется USER_REPORT_EXECUTION, она содержит столбцы USERNAME, REPORT_NAME, REPORT_CATEGORY. Каждая строка в этой таблице представляет собой отчет, который был выполнен пользователем.

Третья таблица называется USER_DEPARTMENTS_LIST, она содержит столбцы USERNAME, USER_DEPARTMENT. В ней находятся все пользователи вместе с их отделами.

Я хочу создать матрицу, которая слева (в строках) покажет REPORT_TYPE, которую можно будет развернуть для отображения REPORT_NAME. В верхней части матрицы (в столбцах) должны быть указаны USER_DEPARTMENT. Значения, показанные в матрице, должны представлять собой количество, отражающее количество выполнений отчетов по USER_DEPARTMENT для каждого REPORT_NAME.

В настоящее время я могу сделать это, используя только таблицы USER_REPORT_EXECUTION и USER_DEPARTMENT. Проблема в том, что если в REPORTS_MASTER_LIST есть отчет, который никогда не выполнялся пользователем, он не появится в матрице, хотя мне нужно, чтобы он отображался и показывал ‘0’ для каждого USER_DEPARTMENT. Есть ли способ сделать это, интегрировав таблицу REPORTS_MASTER_LIST в матрицу каким-либо образом?

Ответ или решение

Создание матрицы счетов с использованием мастер-списка отчетов

Ваша задача заключается в создании матрицы, которая будет отображать количество выполненных отчетов пользователями, с разделением по категориям отчетов и отделам пользователей. Давайте разберем необходимую логику и SQL-запросы, чтобы правильно интегрировать таблицу REPORTS_MASTER_LIST и обеспечить отображение всех отчетов, включая те, которые не были выполнены ни разу.

Описание таблиц

  1. REPORTS_MASTER_LIST: Данная таблица содержит два столбца — REPORT_NAME и REPORT_CATEGORY. Она включает все отчеты, доступные для выполнения пользователями.

  2. USER_REPORT_EXECUTION: В этой таблице имеются поля USERNAME, REPORT_NAME и REPORT_CATEGORY, которые фиксируют факты выполнения отчетов пользователями.

  3. USER_DEPARTMENTS_LIST: Здесь представлена информация о пользователях и их соответствующих отделах — USERNAME и USER_DEPARTMENT.

Построение матрицы

Для построения необходимой матрицы, где по строкам находятся REPORT_CATEGORY и REPORT_NAME, а по столбцам — USER_DEPARTMENT, необходимо создать SQL-запрос, который включает все отчеты из REPORTS_MASTER_LIST, даже те, которые не были выполнены. Для этого можно использовать структуру с объединением данных через таблицу пользователей и отчетов.

SQL-запрос

Ниже приведен пример SQL-запроса, который позволяет достичь поставленной цели. Используем конструкцию LEFT JOIN, чтобы заявить, что мы хотим видеть все элементы из REPORTS_MASTER_LIST и только те, которые соответствуют выполненным отчетам.

SELECT 
    rml.REPORT_CATEGORY,
    rml.REPORT_NAME,
    udl.USER_DEPARTMENT,
    COUNT(ure.USERNAME) AS execution_count
FROM 
    REPORTS_MASTER_LIST rml
CROSS JOIN 
    (SELECT DISTINCT USER_DEPARTMENT FROM USER_DEPARTMENTS_LIST) udl
LEFT JOIN 
    USER_REPORT_EXECUTION ure ON rml.REPORT_NAME = ure.REPORT_NAME 
                               AND ure.REPORT_CATEGORY = rml.REPORT_CATEGORY
                               AND ure.USERNAME IN (SELECT USERNAME FROM USER_DEPARTMENTS_LIST)
GROUP BY 
    rml.REPORT_CATEGORY,
    rml.REPORT_NAME,
    udl.USER_DEPARTMENT 
ORDER BY 
    rml.REPORT_CATEGORY, 
    rml.REPORT_NAME, 
    udl.USER_DEPARTMENT;

Пояснение запроса:

  1. CROSS JOIN: Используется для получения всех сочетаний отчетов и отделов. Это необходимо для того, чтобы включить даже те отчеты, которые не были выполнены ни разу.

  2. LEFT JOIN: Это соединение позволяет оставлять строки из REPORTS_MASTER_LIST даже в случае отсутствия выполнений в USER_REPORT_EXECUTION.

  3. COUNT(ure.USERNAME): Счетчик, который возвращает количество выполнений каждого отчета. Если отчет не был выполнен, значение будет равно 0.

  4. GROUP BY: Соединяет все данные по категориям и названиям отчетов и отделам, что позволяет получить нужную структуру.

  5. ORDER BY: Упорядочивает результат по категории отчетов и названиям, чтобы результат был организованным и легким для восприятия.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...