2017-01-30 13 views
0

Ich muss eine DAX-Anweisung schreiben, die von einem konzeptionellen/logischen Standpunkt etwas komplex ist - also könnte das schwer zu erklären sein.DAX Berechnete Spalte basiert auf zwei Spalten von anderer Tabelle

Ich habe zwei Tabellen.

Auf der ersten Tabelle (siehe unten) habe ich eine Liste von numerischen Werten (Löhne). Für jeden Wert habe ich einen entsprechenden Datumsbereich. Ich habe auch EmployeeID und FunctionID. Der Zweck dieser Tabelle besteht darin, die Stundenlöhne zu verfolgen, die an Mitarbeiter gezahlt wurden, die bestimmte Funktionen in bestimmten Zeiträumen ausführen. Jede Funktion verfügt über einen eigenen Lohn auf der Lohntabelle, ABER jeder Mitarbeiter möglicherweise einen anderen Lohn für die gleiche Funktion (es gibt auch ein Maß für Funktionen und Mitarbeiter) bezahlt.

'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 

Auf 'Tabelle 2' habe ich einen Datensatz für jeden Tag, an dem ein Mitarbeiter eine bestimmte Funktion bearbeitet. Denken Sie daran, Tabelle 1 enthält die Lohninformationen für jede Funktion.

'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 

(Beachten Sie, dass die Löhne im Laufe der Zeit ändern können)

Was ich versuche eine berechnete Spalte auf ‚Tabelle 2‘ genannt ‚DailyWage‘ zu tun ist, erstellen. Ich möchte, dass jede Zeile in "Tabelle 2" mir sagt, wie viel die Mitarbeiter-ID für den ganzen Tag bezahlt wurde (unter der Annahme eines 8-Stunden-Arbeitstages).

ich mit den logischen Schritten wirklich bin zu kämpfen, so dass ich bin mir nicht sicher, was der beste Weg, um diese Berechnung zu tun ist ...

Um alles noch schlimmer machen, könnte ein EmployeeID einen anderen Lohn bezahlt für die gleiche Funktion an einem anderen Datum. Sie könnten mit einer Lohnarbeitsfunktion X beginnen und dann sollte ihr Gehalt in der Zukunft einige Monate steigen ... Das heißt, wenn ich versuche, die EmployeeID und die FunctionID zu verketten, kann ich keine Verbindung herstellen die Tabellen auf dem verketteten Wert, weil keine Tabelle eindeutige Werte aufweist. Wenn wir also die EmployeeID und die FunctionID zu EmpFunID VERKATZEN, müssen wir die EmpFunID + das Datum für die aktuelle Zeile nehmen und dann sagen: "nimm die EmpFunID in der aktuellen Zeile, plus das Datum für die aktuelle Zeile.

Zeile und dann den Wert zurück, aus der Lohn Spalte auf der Lohntabelle, die die gleiche EmpFunID hat und eine Startdatum weniger, dass die CurrentRowDate und hat eine EndDate größer als die CurrentRowDate

Hier ist, was ich bis jetzt:

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]) 

Jetzt brauche ich nur, dass in eine DAX-Funktion umgewandelt.

+0

Warum erstellen Sie keine Spalte, in der die Mitarbeiter-ID und die Funktions-ID in beiden Tabellen kombiniert sind und diese zum Nachschlagen von Daten verwenden? – teylyn

+0

Nur aktualisiert - der Lohnwert kann sich im Laufe der Zeit ändern, also auf der Tabelle 2, wenn ich Mitarbeiter # 1234 Funktion # 20 für $ 18/Std. Am 1/4/2016 und dann am 1.5.2016 habe, dass Mitarbeiter eine Gehaltserhöhung erhält zu $ 22 haben wir dann die gleiche WageFunctionID Combo mit 2 verschiedenen Lohnwerten. – james5

Antwort

0

Nicht sicher, ob es völlig richtig ist, aber vielleicht etwas ähnliches? Wenn Sie dies als berechnete Spalte in Tabelle2 einfügen, wird der aktuelle Zeilenkontext der Tabelle2 in einen Filterkontext umgewandelt.

So SUMX wird die Daten der aktuellen Zeile aus Tabelle2 verwenden und wird eine Summe auf eine gefilterte Version der Lohntabelle tun: Lohntabelle wird mit dem aktuellen Datum, Mitarbeiter-ID und Funktionid aus Tabelle2 und für jede Zeile gefiltert werden in der Tabelle2 werden nur die Löhne summiert, die zur aktuellen Zeile gehören.

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