none
MDX Abfrage: Nur Member anzeigen, keine Leaves RRS feed

  • Frage

  • Hallo zusammen,

    ich habe eine Hierarchie mit unterschiedlich tiefer Struktur bis zu den Leaves. Wie kann ich mit MDX das Bäumchen in beliebiger Tiefe abfragen, ohne Leaves anzuzeigen? Bzw. gibt es eine Möglichkeit die Hierarchie so aufzubauen, ohne dass das Problem auftritt? (Wobei die Äste der Hierarchie ungleich verzweigt sind. Wenn alle Äste gleich lang sind, ist es ja kein Problem.)

    Hierarchie:
    Alle
    ---Member1
    ------Leave1
    ------Leave2
    ---Member2
    ------Member3
    ---------Leave3

    Wie kann ich das Abfrageergebnis kriegen, wobei nur "Alle" und eine Tiefe (descendants...) in der Abfrage vorkommt:

    Alle
    ---Member1
    ---Member2
    ------Member3

    Das Problem tritt naturgemäss bei Gewinn- und Verlustrechnungen auf und lässt sich nur durch hässliche Dummy-Member verhindern - aber mit Analysis Services habe ich damit noch keine Erfahrungen.

    lg

    arno

    Freitag, 24. Februar 2012 16:08

Antworten

  • Hallo Arno,

    wenn ich Dich richtig verstanden habe, willst Du alle Member, die keine Children mehr haben, also nicht nur die unterste Ebene, da das bei einem unbalanced tree nicht das gewünschte Ergebnis bei raus kommt.

    Die IsLeaf Funktion sollte auch in dem Fall das richtige Ergebnis liefern. Bestes Beispiel ist im AdventureWorks Cube die Parent-Child Hierachy Emlpoyee, den solch ein Baum Vorgesetzter/Mitarbeiter ist selten ausbalanziert. Beispiel um sich anzeigen zu lassen, wer ein Leaf ist:

    WITH MEMBER MEASURES.IsLeafMember AS
       IsLeaf([Employee].[Employees].CurrentMember)
      
    SELECT 
        { IsLeafMember } ON 0
        ,
        { [Employee].[Employees].Members } ON 1
    FROM [Adventure Works];

    Mit einem Filter könntest Du dann die unerwünschten Leaf Members entfernen:

    WITH SET NoneLeafs AS
       FILTER ([Employee].[Employees].Members
               ,IsLeaf([Employee].[Employees]) = FALSE)
    SELECT 
        { } ON 0
        ,
        { NoneLeafs } ON 1
    FROM [Adventure Works];


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing

    • Als Antwort markiert cavallino Dienstag, 6. März 2012 12:16
    Mittwoch, 29. Februar 2012 16:28

Alle Antworten

  • mir fällt nur das ein, also zeige alles ausser leaves im Sinne von:

    select except(

    descendants(all)

    , descendants(all,, leaves)

    )

    Kann man (dummy) Members erstellen, die "unsichtbar" in Abfragen sind, aber eine balancierte Hierarchie ergeben?

    Dienstag, 28. Februar 2012 08:47
  • Hallo Arno,

    wenn ich Dich richtig verstanden habe, willst Du alle Member, die keine Children mehr haben, also nicht nur die unterste Ebene, da das bei einem unbalanced tree nicht das gewünschte Ergebnis bei raus kommt.

    Die IsLeaf Funktion sollte auch in dem Fall das richtige Ergebnis liefern. Bestes Beispiel ist im AdventureWorks Cube die Parent-Child Hierachy Emlpoyee, den solch ein Baum Vorgesetzter/Mitarbeiter ist selten ausbalanziert. Beispiel um sich anzeigen zu lassen, wer ein Leaf ist:

    WITH MEMBER MEASURES.IsLeafMember AS
       IsLeaf([Employee].[Employees].CurrentMember)
      
    SELECT 
        { IsLeafMember } ON 0
        ,
        { [Employee].[Employees].Members } ON 1
    FROM [Adventure Works];

    Mit einem Filter könntest Du dann die unerwünschten Leaf Members entfernen:

    WITH SET NoneLeafs AS
       FILTER ([Employee].[Employees].Members
               ,IsLeaf([Employee].[Employees]) = FALSE)
    SELECT 
        { } ON 0
        ,
        { NoneLeafs } ON 1
    FROM [Adventure Works];


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing

    • Als Antwort markiert cavallino Dienstag, 6. März 2012 12:16
    Mittwoch, 29. Februar 2012 16:28
  • Hallo Olaf,

    danke für deinen Tip, der führt mich zu:

    WITH MEMBER MEASURES.IsLeafMember AS
       IsLeaf([Report].[ParentID].CurrentMember)
    SELECT 
        { IsLeafMember } ON 0
        ,
        { Descendants([Report].[ParentID].&[001GUVS], 1, self_and_before) } ON 1
    FROM [cube];

    In dem Ergebnis sehe ich, dass meine Calculated Members, die da angezeigt werden, auch "Leaves" sind! Dementsprechend würden sie beim Filtern wegfallen, bzw. tun es auch. Das ist sehr, sehr schlecht.

    Es hat mich aber zu dieser Abfrage geführt, die hoffentlich mein Problem (Leaves wegglassen, calc. member anzeigen) halbwegs löst: 

    select 
          [Measures].[Saldo] 
    on 0
          , non empty  
          hierarchize(
          Descendants([Report].[ParentID].&[001GUVS], 1, self_and_before)
          -Descendants([Report].[ParentID].&[001GUVS],,Leaves)
          +[Report].[ParentID].&[001GUVS].children
           )
    on 1
    from [cube];

    Im Moment verwende ich +[Report].[ParentID].&[001GUVS].children, um normale und calculated members an dieser Stelle doch anzuzeigen. Gibt es eine Möglichkeit, nur calculated members zu wählen (isCalculatedMember gibt es leider nicht...).

    EDIT: obige Abfrage funktioniert, es kommen keine ungewollten Children, da non empty anscheinend doch wieder alle Nullen löscht. Allerdings möchte ich schon wissen, wie ich gezielt calculated members auswählen kann.

    lg

    arno





    • Bearbeitet cavallino Mittwoch, 29. Februar 2012 18:16
    Mittwoch, 29. Februar 2012 17:56
  • Hallo Arno,

    mit berechneten Sets habe ich mich noch nicht beschäftigt, deswegen habe ich bisher auch noch keine bessere Lösung.

    Ich hatte es auch schon mit der Leaves Funktion versucht; also als Idee (Hierachy Members - Leaves(Hierachy)), aber das Statement lief dann endlos. Ausschlag war der Hinweis "Blattelemente sind Tupel, die durch das kartesische Produkt der niedrigsten Ebene aller Attributhierarchien gebildet werden. Berechnete Elemente sind ausgeschlossen." bei der Leaves Funktion.


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing

    Mittwoch, 29. Februar 2012 18:48