Как создать / обработать сложные условия соединения в «табличной» модели служб Analysis Services между двумя таблицами SCD Type2 с отношением 1: M? - PullRequest
0 голосов
/ 06 марта 2019

Я новичок в Analysis Services и работаю над дизайном табличной модели. Нужен совет / предложение экспертов по наилучшему подходу и способам работы по сценариям ниже.

Предположим, у меня есть две таблицы «Отдел» и «Сотрудник», в которых я храню данные для разных клиентов (арендаторов), и между этими двумя таблицами существует отношение «один ко многим» (1: M) (т. Е. В одном отделе может быть 1 или более сотрудники)

Однако предположим, что обе таблицы относятся к типу SCD 2, то есть хранят историю с датами вступления в силу и прекращения действия. Для этих таблиц на уровне базы данных не создано никаких ограничений, индексов и т. Д.

Department table:
cust_id dept_id dept_name   efctv_dt    trmntn_dt   Dept_key
1001    D1      IT        12-01-2018    12-31-9999  1001D1
1001    D2      HR        01-01-2019    12-31-9999  1001D2
1002    D3      Admin     02-01-2019    02-28-2019  1002D3
1002    D3      HR+Admin  03-01-2019    12-31-9999  1002D3
1002    D4      Finance   02-01-2019    12-31-9999  1002D4

Employee table:
cust_id emp_id  emp_name    dept_id efctv_dt    trmntn_dt   Emp_key
1001    E1      XYZ          D1    01-01-2019   01-31-2019  1001D1
1001    E1      XYZ-A        D1    02-01-2019   12-31-9999  1001D1
1001    E2      ABC          D2    02-01-2019   12-31-9999  1001D2
1002    E3      AXBYCZ       D3    03-01-2019   03-31-2019  1002D3
1002    E3      AXBYCZ       D4    04-01-2019   12-31-9999  1002D4
1002    E4      DEFG         D4    04-01-2019   12-31-9999  1002D4

Столбцы cust_id и dept_id могут быть объединены вместе в виде отдельного столбца в обеих таблицах в качестве ключевого поля и использованы в качестве соединения между обеими таблицами.

Ключ отдела = Конкатенация (отдел [cust_id], отдел [dept_id])

Ключ сотрудника = сцепленный (сотрудник [cust_id], сотрудник [dept_id])

Пример ключевых значений выхода = 1001D1, 1001D2, 1002D3, 1002D4

Теперь предположим, что у нас есть следующие требования к отчетности, т. Е.

Для фильтрации по диапазонам дат (в визуализации) - при условии, что есть еще одна таблица измерений дат со всеми датами и иерархией

1) Если не выбран конкретный диапазон дат или фильтр - показать все текущие имена активных сотрудников и отделов (где trmntn_dt = 12-31-9999)
Итак, ожидаемый результат:

Emp Name Название отдела
XYZ-A IT
ABC HR
AXBYCZ Finance

2) При составлении отчета за конкретный месяц - январь-2019 - показывать имена всех сотрудников и отделов, активных на этот месяц. Итак, ожидаемый результат:

Emp Name Название отдела
XYZ IT

3) При составлении отчетности для конкретного квартала, например, в первом квартале 2009 года, показывать имена всех сотрудников и отделов, активных на данный квартал. Итак, ожидаемый результат:

Emp Name Название отдела
XYZ-A IT
ABC HR
AXBYCZ HR + Admin

Однако условие соединения в табличной модели AS с отношением 1: M между этими двумя таблицами не будет выполнено, поскольку строки не являются уникальными в таблице Department (строки для D3), которая находится на одной стороне отношения.

Если вы включите efctv_dt или trmntn_dt также в условие объединенного соединения в обеих таблицах в качестве ключа для объединения, т.е.

Ключ отдела = Конкатенация (отдел [cust_id], отдел [dept_id]) и Конкатенация (отдел [efctv_dt], ””))

Ключ сотрудника = конкатенация (сотрудник [cust_id], работник [dept_id]) и конкатенация (сотрудник [efctv_dt], ”»))

Пример ключевых выходных значений = 1001D112-01-2018, 1001D201-01-2019…

Однако, хотя теперь строки будут уникальными, поскольку мы не ожидаем, что одна и та же строка будет дважды в один и тот же день (если только некоторые проблемы ETL, например, процесс не выполнялся дважды в один и тот же день и т. Д.)

AS табличная модель не позволяет создавать сложные соединения / условия (как в SAP BO Universe), чтобы мы могли добавить условие ниже при объединении этих двух таблиц типа 2 SCD, как показано ниже, что может помочь решить некоторые из требований.

    dept.cust_id = emp.cust_id
And dept.dept_id = emp.dept_id
And ( calendar_date is between efctv_dt and trmntn_dt 
        Or 
       trmntn_dt = ’12-31-9999’
    )

Я думаю, что для создания / вычисления любого значения показателя все еще выполнимо множество примеров, доступных в Интернете на DAX, но как насчет только размерных атрибутов?

Это правильный подход? Как справиться с этим?

...