none
Daten aus Cube und Dimension auslesen und mit Tabelle verknüpfen RRS feed

  • Frage

  • Hallo,

    meine Kenntnisse zu Analysis Services halten sich leider in extremen Grenzen.

    Nun habe ich das folgende Problem:
    In einem Cube und entsprechenden Dimensionen werden Kundenumsätze ermittelt.
    In einer unserer SQL-Server 2008 R2 Datenbanken habe ich eine Tabelle mit weiteren Kundendaten.
    Gefordert ist nun, dass ich diese Daten miteinander verknüpfe.
    Leider scheitert das schon daran, dass ich mittels MDX keine Daten bekommen, weil ich angeblich keine Berchtigung habe.
    Eine Rolle mit Leseberechtigungen ist aber angelegt.

    Kann mir jemand sagen wie ich mit diesem Problem weiter komme?
    Die zu verwendenden Dimensionen sind Kundennummer, Jahr, Monat aus dem Kube benötige ich das Ergebnis.

    Bin für jeden Hinweis dankbar.

    Gruß

    cheapy

    Donnerstag, 22. Januar 2015 14:37

Antworten

  • Wie ich schon sagt, das Thema BI ist nicht ganz so leicht und man muss sich da schon etwas rein arbeiten. MDX sieht zwar so ähnlich wie SQL aus, hat aber doch seine eigene Logik.

    Mehrere Dimesionsattribute kannst Du mittels CrossJoin ausgeben lassen, das man vereinfach mit einem Sternchen * schreiben kann. Wieder am Beispiel AdventureWorks, erweitert um einen Filter auf das Land:

    SELECT 
        { [Measures].[Internet Sales Amount] } ON 0
    	,
    	
    	{ NONEMPTY(
    	    [Date].[Calendar Year].AllMembers
    		-- Nur DE bis US
    	  * [Customer].[Country].&[Germany] : [Customer].[Country].&[United States]
    	  )
    	} ON 1
    FROM [Adventure Works]


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    • Als Antwort markiert Cheaptrick_la Freitag, 23. Januar 2015 08:52
    Freitag, 23. Januar 2015 08:08

Alle Antworten

  • Ich bin jetzt zwar etwas weiter gekommen, habe aber noch immer nicht das was ich möchte.
    Hiermit bekomme ich das Gesamtergebnis aber nicht aufgeteilt nach Geschäftsjahren:

    SELECT {[Measures].[Ergebnis]} ON Columns,
    { [Geschäftsjahr]} ON ROWS
    FROM [Cube]

    Das Ergebis sieht so aus:
                                      Ergebnis
    Alle Geschäftsjahr     1.000.000€
    Warum werden mir nicht die Jahre Detailliert angezeigt?

    Wenn ich es so versuche, bekomme ich eine Fehlermeldung:

    SELECT {[Measures].[Ergebnis]} ON Columns,
    {[Kunde],[Geschäftsjahr], [Periode]} ON ROWS
    FROM [Cube]

    Zwei Mengen in der -Funktion weisen eine unterschiedliche Dimensionalität auf.
    Im Grunde stimmt das auch, weil [Kunde],[Geschäftsjahr], [Periode] aus drei verschiedenen Dimensionen stammen. Aber wie kombiniere ich das dann korrekt?

    Gruß

    cheapy



    Donnerstag, 22. Januar 2015 15:15
  • SELECT {[Measures].[Ergebnis]} ON Columns,
    { [Geschäftsjahr]} ON ROWS
    FROM [Cube]

    Hallo cheapy,

    Du hast hier nur den Dimensionsnamen angegeben, es muss aber das gewünschte Attribute angeben; fehlt das wird der Default Member ausgegeben und das ist im Standard der "AllMember". Nehmen wir mal an, das Attribute heisst "Jahr", dann sollte die Abfrage so aussehen:

    SELECT {[Measures].[Ergebnis]} ON Columns,
           { [Geschäftsjahr].[Jahr].AllMembers } ON ROWS
    FROM [Cube]


    Olaf Helper

    [ Blog] [ Xing] [ MVP]


    Donnerstag, 22. Januar 2015 15:20
  • Hallo Olaf,

    ich war inzwischen auf die Sache mit Members gestoßen, sehe im Ergebnis keinen Unterschied zu AllMembers.
    Gibt es da einen?

    Wie komme ich mit den Dimensionen weiter?

    Gruß

    cheapy

    Donnerstag, 22. Januar 2015 15:30
  • Der Unterschied ist das Abfrageergebnis:


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Donnerstag, 22. Januar 2015 15:39
  • Hallo Olaf,

    und wie schaffe ich es mehrere Dimensionen anzuzeigen bzw. Geschäftsjahr und Periode gleichzeitig anzuzeigen?

    In den Spalten benötige ich folgendes:
    Kundenummer Geschäftsahr Monat Umsatz

    Wobei ich Geschäftsjahr und Monat wohl einer Dimension entnehmen kann.

    gruß

    cheapy

    Freitag, 23. Januar 2015 06:15
  • Wie ich schon sagt, das Thema BI ist nicht ganz so leicht und man muss sich da schon etwas rein arbeiten. MDX sieht zwar so ähnlich wie SQL aus, hat aber doch seine eigene Logik.

    Mehrere Dimesionsattribute kannst Du mittels CrossJoin ausgeben lassen, das man vereinfach mit einem Sternchen * schreiben kann. Wieder am Beispiel AdventureWorks, erweitert um einen Filter auf das Land:

    SELECT 
        { [Measures].[Internet Sales Amount] } ON 0
    	,
    	
    	{ NONEMPTY(
    	    [Date].[Calendar Year].AllMembers
    		-- Nur DE bis US
    	  * [Customer].[Country].&[Germany] : [Customer].[Country].&[United States]
    	  )
    	} ON 1
    FROM [Adventure Works]


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    • Als Antwort markiert Cheaptrick_la Freitag, 23. Januar 2015 08:52
    Freitag, 23. Januar 2015 08:08
  • Hallo Olaf,

    danke, das funktioniert super! :-)
    Nun habe ich aber gleich zwei neue Fragen:

    • Ich benötige in der MDX Abfrage nur die beiden letzten Jahre, geht das auch irgendwie dynamisch, ohne das ich nach jedem Jahreswechsel die MDX ändern muss
    • Wie kann ich die Ergebnisse dieser MDX-Abfrage in einer Datenbank-View verwenden?

    Gruß

    cheapy

    Freitag, 23. Januar 2015 08:52
  • Zu 2.: Du kannst aus RDBMS via Linked Server auf SSAS zugreifen und MDX Abfragen ausführen, siehe Creating a Linked Server for Analysis Services

    Zu 1.: In SSAS ist das Excel-Assembly eingebunden und das stellt einem neben den vielfältigen Excel Funktion sogar VBA bereit, dort wieder rum gibt es die Funktion Now() fürs aktuelle Datum/Uhrzeit und die Funktion Year für den Jahreswert. Das zusammen mit StrToMember (MDX) erlaubt einen, dynamisch einen Jahres-Member zu ermitteln:

    SELECT {    
    	    StrToMember('[Date].[Calendar Year].[CY ' + Str(VBA!Year(Now()) - 10) + ']')		
    	   } ON 0
    FROM [Adventure Works]


    Olaf Helper

    [ Blog] [ Xing] [ MVP]


    Freitag, 23. Januar 2015 09:09
  • Der zweite Punkt hat sich inwischen mehr oder weniger erledigt.

    So bekomme ich die gewünschten Daten:

    SELECT a.*
    FROM          OPENROWSET('MSOLAP', 'DATASOURCE=MyDataSource; Initial Catalog=MyOLAP_DB;', 
    'SELECT {[Measures].[Ergebnis]} ON 0,
    	{NONEMPTY(
    			[Jahr].AllMembers 
    			* [Monat].&[1]
    			: [Monat].&[12]
    		  * [Kunde].[Kundennumer].AllMembers
    		  )} on rows
    FROM [Cube]'
    ) AS a

    Die Daten haben aber leider alle den Typ ntext, kann ich die schon in der OLAP-Anfrage anpassen oder muss ich das dann später im Select mit Cast/Convert machen?

    Freitag, 23. Januar 2015 10:53
  • Das Ergebnis kannst Du kann im SELECT per CONVERT in anderen Datentypen konvertieren.

    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Samstag, 24. Januar 2015 09:04
  • Hallo Olaf,

    irgendwie scheint es wohl doch nicht so einfach zu sein.

    Ich habe es mit

    CONVERT(int, MyFiled) AS MyFieldInt

    versucht. Das führt zu folgender Fehlermeldung:
    Die explizite Konvertierung des ntext-Datentyps in int ist nicht zulässig.

    Darum auch meine Frage, ob ich das nicht direkt in MDX machen kann.

    Gruß

    cheapy


    Montag, 26. Januar 2015 09:51