Я новичок в 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, но как насчет только размерных атрибутов?
Это правильный подход? Как справиться с этим?