2017-11-27 5 views
1

Ich habe eine kumulative Summe einer Maßnahme strukturiert wie:Langsam SSAS kumulative Summe berechnete Kennzahl

Aggregate (
    { NULL : [Date].[Year - Month - Date].CurrentMember } 
    ,[Measures].[Applications]) 

Ab dem Zeitpunkt der ersten Anwendung auf das aktuelle Datum, die Tage des Datumsbereiches muss zusammenhängend sein.

Die Datumsdimension enthält jedoch Datumsangaben von 1900-01-01 bis weit in die Zukunft.

Ich habe versucht, Daten vor der ersten Anwendung zu beseitigen und zukünftige Termine, indem die berechnete Kennzahl Strukturierung wie folgt:

CREATE MEMBER CURRENTCUBE.[Measures].[Applications TD] AS 
CASE 
WHEN 
    /* Eliminates dates before first applications, i.e. year 1900-01-01 */ 
    Aggregate (
     { NULL : [Date].[Year - Month - Date].CurrentMember } 
     ,[Measures].[Applications]) < 0 
THEN NULL 
WHEN 
    /* Eliminates dates after today */ 
    [Date].[Year - Month - Date].CurrentMember.MemberValue >= StrToMember('[Date].[Date].&['+Format(Now(),"yyyy-MM-ddT00:00:00")+']').MemberValue 
THEN NULL 
ELSE 
    Aggregate (
      { NULL : [Date].[Year - Month - Date].CurrentMember } 
      ,[Measures].[Applications])   
END 

Ich habe nur durch Aggregation in jeder Versuch, dies zu optimieren nicht erfolgreich gewesen, wo mit Hilfe benötigt ein SCOPE als Alternative zur case-Anweisung, die EXISTS- und EXCEPT-Funktionen und viele andere verwendet.

Beim Durchsuchen des Würfels und Dimensionierung [Measures].[Applications TD] von [Date].[Year - Month - Date] benutzerdefinierte Hierarchie ist es schrecklich langsam.

+0

brauchen Sie 'Aggregate' oder ist es in Ordnung,' Sum' zu verwenden? – whytheq

+0

Summe sollte in diesem Fall funktionieren. – samb0x

Antwort

2

IIF ist in der Regel schneller als CASE, und SUM ist oft schneller als AGGREGATE.
Obwohl Ihr Hauptproblem der zweite Teil Ihrer Erkrankung mit membervalue ist - ist es erforderlich oder wird das Folgende nicht das gleiche tun? :

CREATE MEMBER CURRENTCUBE.[Measures].[Applications TD] AS 
IIF(
    SUM (
     { NULL : [Date].[Year - Month - Date].CurrentMember } 
     ,[Measures].[Applications] 
    ) < 0 
    , NULL 
    , 
    SUM (
     { NULL : [Date].[Year - Month - Date].CurrentMember } 
      ,[Measures].[Applications] 
    ) 
) 

Ich würde dies als benutzerdefinierte Mitglied trennen:

CREATE MEMBER CURRENTCUBE.[Date].[Date].[All].[Today] AS //<< a little of syntax for this create 
    StrToMember('[Date].[Date].&['+Format(Now(),"yyyy-MM-ddT00:00:00")+']') 

Dann versuchen Sie eine verschachtelte IIF:

CREATE MEMBER CURRENTCUBE.[Measures].[Applications TD] AS 
IIF(
    [Date].[Year - Month - Date].CurrentMember.MemberValue >= [Date].[Date].[All].[Today].MemberValue 
    , NULL 
    , IIF(
     SUM (
      { NULL : [Date].[Year - Month - Date].CurrentMember } 
      ,[Measures].[Applications] 
     ) < 0 
    , NULL 
    , 
    SUM (
      { NULL : [Date].[Year - Month - Date].CurrentMember } 
      ,[Measures].[Applications] 
    ) 
) 
) 

ABER

Anstatt sich mit dem "Today" -Member zu beschäftigen, ist es viel effizienter, wenn Sie DimDate eine isToday-Spalte hinzufügen - und dann ein Attribut der Datumsdimension der Cubes verwenden, indem Sie die Spalte verwenden. Auf diese Weise sollten Sie in der Lage sein, dies zu vereinfachen [Date].[Year - Month - Date].CurrentMember.MemberValue >= [Date].[Date].[All].[Today].MemberValue

+0

Vielen Dank für die Empfehlungen. Mit dieser Maßnahme kann ich Visuals gegen Date erstellen, um die kumulative Summe für jeden Tag zu sehen. Ohne den zweiten Teil mit Membervalue wird im Wesentlichen der Wert bis heute für jeden Tag bis 2027 wiederholt (DimDate enthält Daten bis zu 10 Jahren in der Zukunft). Vielleicht sollte das eine andere Frage sein? – samb0x

+0

@ samb0x ok - Ich verstehe jetzt dein Problem, unsere Würfel haben nur Daten bis gestern in DimDate - das ist der Grund, den ich nicht verstanden habe. Ist das Maß jetzt schnell mit den Änderungen? Haben Sie Zugriff auf Änderungen am Warehouse/Cube? – whytheq

+0

Ich habe eine Version von diesem implementiert und es ist schon eine große Verbesserung. Ich weiß nicht, wie ich "[Datum]. [Datum]. [Alle]. [Heute]" konstruieren soll. Ich habe eine neue Spalte "Heute" in DimDate, die das heutige Datum hat, dann verwenden Sie [Datum]. [Jahr - Monat - Datum] .CurrentMember.MemberValue> = [Datum]. [Heute] .item (0) .MemberValue Es funktioniert viel besser, aber ich bin daran interessiert, wie Sie konstruieren "[Datum]. [Datum]. [Alle]. [Heute]" – samb0x