Преобразование SQL многие ко многим JOIN с ограничением в DAX / PowerBI - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь воссоздать объединение двух таблиц, регистрации времени и расписания, в одну таблицу, которую я затем фильтрую на основе разницы между запланированным временем начала и фактическим временем начала.В принципе;Я пытаюсь определить, опоздал ли сотрудник или рано.

Мой запрос в SQL выглядит следующим образом и работает так, как нужно, я просто не могу понять, как заставить это объединение работать в DAX дляPower BI, не говоря уже о временных ограничениях.

SELECT 
    tr.employee_employeeID AS EmployeeID, 
    tr.rawstarttime AS Actual_Start, 
    s.StartTime_Schedule AS Schedule_Start

FROM 
    timeregistration tr, 
    schedule s
WHERE 
    tr.Employee_EmployeeID = s.Employee_EmployeeID
AND 
    DATEDIFF(MINUTE, tr.RawStartTime, s.StartDateTime) < 60
AND 
    DATEDIFF(MINUTE, tr.RawEndTime, s.StartDateTime) > -60

И таблицы и отношения выглядят примерно так: Структура таблицы До сих пор я пробовал следующее:

GENERATE(timeregistration; schedule)- который вернулсяThe Column with the name of 'EmployeeID' already exists in the 'date_diff' Table.

NATURALINNERJOIN(timeregistration; schedule)- который вернулсяNo common join columns detected. The join function 'NATURALINNERJOIN' requires at-least one common join column.

CROSSJOIN(timeregistration; schedule)- который вернулсяThe Column with the name of 'EmployeeID' already exists in the 'date_diff' Table.

На данный момент я не знаю, что делать с JOIN, поэтому любая помощь будет признательна.

С уважением,Martien

(редактирование: исправлены ошибки форматирования)

1 Ответ

0 голосов
/ 20 декабря 2018

Решено с помощью этого DAX-запроса

date_diff = 
 FILTER(
    ADDCOLUMNS( 
        GENERATEALL(
            schedule;
            VAR schedule_id = schedule[EmployeeID]
            RETURN 
                SELECTCOLUMNS(
                CALCULATETABLE( 
                    timeregistration;
                    timeregistration[EmployeeID] = schedule_id
                );
                "StartTime_timeregistration"; timeregistration[StartTime_actual]
                )
        );
        "diff"; DATEDIFF([StartTime_schedule];[StartTime_timeregistration];SECOND)
    );
    3600 >= [diff] &&
    -3600 <= [diff] &&
    NOT(ISBLANK([StartTime_timeregistration]))
)
...