2017-01-30 25 views
0

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

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

На первой таблице (показано ниже) у меня есть список числовых значений (Заработная плата). Для каждого значения у меня есть соответствующий диапазон дат. У меня также есть EmployeeID и FunctionID. Цель этой таблицы - следить за почасовой заработной платой, выплачиваемой сотрудникам, выполняющим определенные функции, в определенные диапазоны дат. Каждая функция имеет свою собственную заработную плату в таблице заработной платы, НО каждому работнику может быть выплачена другая заработная плата за ту же функцию (есть также измерение для функций и сотрудников).

'Wages' 

Wage StartDate EndDate  EmployeeID  FunctionID 
20  1/1/2016  1/30/2016  3456   20 
15  1/15/2016 2/12/2016  3456   22 
27.5 1/20/2016 2/20/2016  7890   20 
20  1/21/2016 2/10/2016  1234   19 

В «Таблице 2» У меня есть запись за каждый день, когда сотрудник работал с определенной функцией. Помните, что в таблице 1 содержится информация о заработной плате для каждой функции.

'Table 2' 

Date  EmployeeID  FunctionID DailyWage 
1/1/2016 1234   $20   =CALCULATE(SUMX(???)) 
1/2/2016 1234   $20   =CALCULATE(SUMX(???)) 
1/3/2016 1234   $22   see below 
1/4/2016 1234   $22 
1/1/2016 4567   $27 
1/2/2016 4567   $27 
1/3/2016 4567   $27 

(Обратите внимание, что заработная плата может меняться с течением времени)

То, что я пытаюсь сделать, это создать вычисляемый столбец на «Таблица 2» под названием «DailyWage». Я хочу, чтобы каждая строка в «Таблице 2» сообщила мне, сколько EmployeeID было оплачено на весь день (при условии 8-часового рабочего дня).

Я действительно борется с логическими шагами, так что я не уверен, что лучший способ сделать это вычисление ...

Чтобы сделать вещи еще хуже, EmployeeID может получить деньги другой заработной платы для той же функции на другой дате. Они могут начать работу с одной рабочей функцией X, а затем, как правило, их заработная плата должна увеличиться на несколько месяцев в будущем ... Это означает, что если я попытаюсь объединить EmployeeID и FunctionID, я не смогу подключиться таблицы на объединенное значение, потому что ни одна таблица не будет иметь уникальных значений.

Таким образом, если мы CONCATENATE EmployeeID и FunctionID в EmpFunID, нам нужно взять EmpFunID + дату для текущей строки, а затем сказать: «Возьмите EmpFunID в текущей строке, а также дату для текущего строка, а затем возвращает значение из столбца заработной платы на столе заработной платы, которая имеет то же EmpFunID и имеет StartDate меньше, что CurrentRowDate и имеет EndDate больше CurrentRowDate

ВОТ чТО Я ТАК ДАЛЕКО:

Step 1 = Filter 'Wages' table so that StartDate < CurrentRowDate 
Step 2 = Filter 'Wages' table so that EndDate > CurrentRowDate 
Step 3 = LOOKUPVALUE('Wages'[Wage], 'Wages'[EmpFunID], Table2[EmpFunID]) 

Теперь мне просто нужно преобразовать в функцию DAX.

+0

Почему вы не создаете столбец, который объединяет идентификатор сотрудника и идентификатор функции в обеих таблицах и использует это для поиска данных? – teylyn

+0

Только что обновлено - значение заработной платы может меняться со временем, поэтому в Таблице 2, если у меня есть Сотрудник №1234, выполняющий функцию №20 за 18 долларов США/час на 1/4/2016, а затем на 1/5/2016, что сотрудник получает повышение до $ 22, тогда у нас будет одна и та же комбинация WageFunctionID с двумя разными значениями заработной платы. – james5

ответ

0

Не уверен, если он получил это совершенно правильно, но, возможно, что-то подобное? Если вы поместите это в таблицу2 как вычисленный столбец, он преобразует контекст текущей строки таблицы2 в контекст фильтра.

Таким образом, SUMX будет использовать данные текущей строки из Таблицы 2 и будет делать сумму в отфильтрованной версии таблицы заработной платы: таблица зарплат будет отфильтрована с использованием текущей даты, employeeid и functionid из таблицы2, а для каждой строки в таблице 2 он будет только суммировать эту заработную плату, которые относятся к текущей строке.

CALCULATE(
    SUMX(
    FILTER(
    'Wages', 
    'Wages'[StartDate] >= 'Table2'[Date], 
    'Wages'[EndDate] <= 'Table2'[Date], 
    'Wages'[EmployeeId] = 'Table2'[EmployeeId], 
    'Wages'[FunctionId] = 'Table2'[FunctionId] 
    ), 
    'Wages'[Wage] 
) 

 Смежные вопросы

  • Нет связанных вопросов^_^