DAX / PowerPivot-Abfragefunktionen zum Verteilen aggregierter Werte über den Zeitraum

Ich versuche, den DAX-Ausdruck [für MS PowerPivot in Excel 2010] so zu berechnen, dass die Summe eines Werts gleichmäßig über den Bereich verteilt wird, auf den er angewendet wird, und die Summe für einen bestimmten Zeitraum erneut zu erstellen. Es ist trivial, sich in SQL Server gegenseitig zuzuwenden, obwohl bei jedem Versuch das gleiche falsche Ergebnis erzielt wird.

Ich habe die Ausgabe von MS Project als Excel gespeichert und mithilfe von PowerQuery importiert / transformiert. Daher sind Start- und Enddatum die richtigen Daten, {X} h und {Y} d sind ganze Zahlen und die Kalendertagsdauer dazwischen sind bereits für das Modell berechnet / formatiert. Ich habe auch eine Datumstabelle erstellt, die die zusammenhängenden Daten vom ersten bis zum letzten Datum enthält, und eine Jahrestabelle, die die Zeichenfolgendarstellung der vierstelligen Jahre enthält, nach denen ich zusammenfassen möchte.

Das Modell sieht so aus:

Ich habe berechnete Spalten in den ResourceQuery-, TaskQuery- und AssignmentQuery-Tabellen (alle direkt aus der MS Project-Ausgabe entnommen) und in der ServiceAreaQuery (eindeutige Werte aus TaskQuery… im Wesentlichen Unterprojekte) erstellt. Jedes hat auch ein einfaches Maß, das die Summe der Spalte Zugewiesene Stunden ist.

Die Daten selbst sehen so aus, wie Sie es von einer Project 2010-Datei erwarten, und haben ein {start_date}, {finish_date} und Stunden. Die Daten für eine Aufgabe können zwischen 1 Tag und 5 Jahren liegen ... und hier liegt mein Problem.

Wie teile / teile ich den vorab summierten Wert für Aufgaben mit langer Laufzeit so auf, dass er mit dem von mir gesuchten Zeitintervall übereinstimmt?

Auch wenn ich die Jahresspalte aus der Datumstabelle verwende, erkennt die Zeitintelligenz sie nicht und mir gehen die Ideen für ein @ auCALCULATE (SUM (FILTER (COUNTROWS (DATESBETWEEN))) Art der Sache.

Es gibt zwei Zwischenschritte, die ich erfolglos versucht habe herauszufinden. Ich kann mir vorstellen, dass beide durch dieselbe effektive Funktion gelöst werden, um zum @ zu gelange Endziel Stunden, nach Servicebereich, nach Ressource, nach Jahr.

Pivot-Tabelle zum Anzeigen von

Stunden nach Ressource, nach JahrStunden nach Servicebereich, nach Jahr

, um das Endziel von @ zu zeig

Stunden, nach Servicebereich, nach Ressource, nach Jahr

Sie können das Problem in der Ausgabe unten sehen.

Beachten Sie, dass ich bei Verwendung der Summe der zugewiesenen Stunden und des Ressourcennamens von AssignmentQuery die richtigen Summen erhalte, aber bei Verwendung eines beliebigen Datumswerts ... erhalte ich nur die Stunden gegen das Startdatum (die aktive Beziehung im Modell). Was ich brauche, ist, dass diese Stunden gleichmäßig über den Zeitraum verteilt sind, auf den sie zutreffen (wenn also zwischen dem 1.1.16 und dem 1.1.19 1.000 Stunden liegen, würde ich erwarten, dass 333 Stunden pro Jahr angezeigt werden). .

Mein erster Gedanke ist, dass die Selektor- / Filter- / Berechnungsfunktion Folgendes tun muss:

Wählen Sie die Stunden für die PersonWählen Sie die Tage in dem Zeitraum, nach denen gefiltert wird (z. B. Monat / Jahr / Quartal / was auch immer), entweder aus einem Filter oder als SpaltenüberschriftBerechnen Sie die Stunden pro TagLesen Sie die Arbeitstage im gefilterten Zeitraum Wählen Sie die Summe der Stunden aus der Überlappung

Alle Ideen werden sehr geschätzt! Ich bin offen für eine zusätzliche ETL- / Datenerstellung als PowerQuery-Schritt, würde aber gerne den richtigen DAX-Ausdruck dafür finden, damit er als Zeitmesser / Filter für das Projekt zur Verfügung steht.

Danke im Voraus

** Bearbeiten, um die überarbeitete Version der angegebenen Antwort zu veröffentlichen **

[Hours Apportioned Raw] :=
DIVIDE (
    CALCULATE (
                [Hours],
                FILTER (
                    AssignmentQuery,
                    AssignmentQuery[Start_Date] <= MAX ( Dates[Date] )
                        && AssignmentQuery[Finish_Date] >= MAX ( Dates[Date] )
                        )
                )
    , ( COUNTROWS (
                    DATESBETWEEN ( 
                                    Dates[Date]
                                    , FIRSTDATE ( AssignmentQuery[Start_Date] )
                                    , LASTDATE ( AssignmentQuery[Finish_Date] )
                                 )
                  )
      )
)

Antworten auf die Frage(1)

Ihre Antwort auf die Frage