У меня есть примерный набор данных от компании на сотрудника и день, который у меня есть в многомерном кубе.Мне нужно рассчитать эффективные FTE (эквиваленты полного времени) за выбранный пользователем период времени.
Формулы: FTE_actual = SUM (WorkedHoursOverPeriod) / SUM (ScheduleHoursInPeriod) * FTE
ЭтоВот как рассчитывается месяц за месяц в SQL:
WITH fact AS (
SELECT 100 AS EmployeeID, 20190101 AS DateID, 8.00 AS WorkedHours, 8.00 AS ScheduleHours UNION
SELECT 100,20190102,2,8 UNION
SELECT 100,20190103,8,8 UNION
SELECT 100,20190104,0,0 UNION
SELECT 200,20190101,4,8 UNION
SELECT 200,20190102,0,0 UNION
SELECT 300,20190102,8,8 UNION
SELECT 300,20190103,8,8 UNION
SELECT 100,20190201,8,8 UNION
SELECT 200,20190201,8,8 UNION
SELECT 300,20190201,8,8
)
, Dim AS (
SELECT 100 AS EmployeeID, 1.00 AS FTE UNION
SELECT 200,0.50 UNION
SELECT 300,0.20
)
, FTE_Per_Employee AS (
SELECT
SUM(WorkedHours) / SUM(ScheduleHours) * FTE AS FTE_Per_Employee
,fact.EmployeeID
,fact.DateID / 100 AS Month
FROM fact
INNER JOIN Dim ON fact.EmployeeID = Dim.EmployeeID
WHERE ScheduleHours > 0
GROUP BY FTE, fact.EmployeeID, fact.DateID / 100
)
SELECT SUM(FTE_Per_Employee), Month AS FTE_Final
FROM FTE_Per_Employee
GROUP BY Month
Пока что в кубе лучшее, что я получил, это правильный результат, когда в строках выбран «день».Я пытался решить более длительные периоды с помощью этой статьи: https://blog.crossjoin.co.uk/2013/05/29/aggregating-the-result-of-an-mdx-calculation-using-scoped-assignments/, но на самом деле это не работает.Мой расчет либо
FTE_actual = SUM(WH) / SUM(SH) * SUM(FTE)
, либо
FTE_actual = SUM(WH / SH * FTE)
в любом случае неверен, поскольку у меня не может быть SUM () для * FTE части
Я также пыталсяпридумать способ сделать этот расчет каким-либо образом в таблице фактов, но это кажется невозможным, поскольку я не знаю периода агрегации, пока он не будет выбран пользователем при просмотре куба.
Любые идеи, как перевестирасчет в меру куба?