2016-06-02 16 views
0

Ich erstelle einen SSRS-Bericht mit einer Texbox, in die Sie die ID oder den Namen einer Person eingeben können. Ich möchte dies als Filter für die MDX-Abfrage anwenden. Anwenden des Filters auf das bearbeitete Dataset, aber der Bericht dauert zu lange, um auf diese Weise ausgeführt zu werden.Wie fügt man mehrere Filter zur Abfrage hinzu?

Hier ist der MDX der Abfrage-Designer für mich generiert:

SELECT NON EMPTY { [Measures].[Employee Count] } ON COLUMNS 
, NON EMPTY { ([Person].[Emplid].[Emplid].ALLMEMBERS 
* [Person].[First Name].[First Name].ALLMEMBERS 
* [Person].[Last Name].[Last Name].ALLMEMBERS) } 
DIMENSION PROPERTIES MEMBER_CAPTION, MEMBER_UNIQUE_NAME ON ROWS 
FROM [Model] 

Die Logik für den vorgesehenen Filter so sein würde:

WHERE SearchParameter = [Emplid] OR [First Name] + [Last Name] like SearchParameter 

Ich kann herausfinden, wie die Feinabstimmung es, ich Ich suche nur nach einem Beispiel für die richtige MDX-Syntax für den Filter.

Antwort

0

Dank Alejandro mich in der richtigen Richtung mit dem konnte ich FILTER Funktion zeigt mit einer Lösung kommen. Ich musste auch lernen, wie die INSTR Funktion verwenden, um Werte zu dem Parameter zu vergleichen.

select {[Measures].[Passed] , [Measures].[Did not pass]} on 0 
    , filter(
     {[Person].[Emplid].Children * [Person].[First Name].Children * [Person].[Last Name].Children * [Training List].[Training Display Name].Children}, 
     instr([Person].[Emplid].currentmember.member_caption, @SearchParameter) > 0 
      or instr([Person].[First Name].currentmember.member_caption + ' ' + [Person].[Last Name].currentmember.member_caption, @SearchParameter) > 0) on 1 
from [Model] 

Ich hoffe, dass dies jedem helfen wird mit ähnlichen Problemen konfrontiert.

1

Es ist wichtig zu verstehen, wie WHERE Klausel in MDX funktioniert. Die WHERE-Klausel filtert die Zeilenachse nicht. Sie filtert die Dimensionselemente auf den Achsen, die sich mit den in der WHERE-Klausel angegebenen Elementen schneiden.

REFERENCE

auch sagen, dass man Tupel oder eine Reihe von Mitgliedern in der WHERE Klausel angeben:

Beispiel:

WHERE (STRTOMEMBER(@Year)) 

STRTOMEMBER() einen SSRS Textparameter umwandelt (@Year) enthält, [Date].[Year].&[2016] Wert für ein gültiges MDX-Mitglied. In diesem Fall filtert die Klausel WHERE die Mitgliederachsen, die das Jahr 2016 in der Datumsdimension schneiden.

Sie können auch STRTOSET verwenden, um mehrere Mitglieder zum Filtern zu übergeben.

WHERE StrToSet (@Countries, CONSTRAINED) 

@Countries Parameter ist ein Text SSRS Parameter, die die {[Geography].[Geography].[Country].[Germany],[Geography].[Geography].[Country].[Canada]} Mitglieder enthält.

In diesem Fall wird die WHERE-Klausel die Mitglieder filtern, die in der SELECT-Klausel angegeben sind, die die Länder Kanada und Deutschland schneidet.

UPDATE: Basierend auf OP-Feed.

Dies sollte funktionieren.

SELECT NON EMPTY { [Measures].[Employee Count] } ON COLUMNS, 
NON EMPTY 
{ 
    (StrToMember ('[Person].[Emplid].&[123]') * [Person].[First Name].[First Name].AllMembers * [Person].[Last Name].[Last Name].AllMembers) 
} Dimension Properties MEMBER_CAPTION, 
MEMBER_UNIQUE_NAME ON ROWS 
FROM [Model] 

Hinweis bin ich nicht mit der WHERE Klausel aber das Element in den Reihen Achse angeben.

UPDATE: Ich denke, die WHERE Klausel nicht für Ihr requeriment geeignet ist, es scheint, dass Sie benötigen FILTER Funktionen verwenden, um einige Mitglieder von verschiedenen Bedingungen zu wählen.

Wie bereits erwähnt, filtert die Klausel WHERE die Elemente in Ihren Achsen, die sich mit den angegebenen Elementen schneiden. Filter Funktion kann verwendet werden, um Mitglieder zu filtern, die die angegebenen Kriterien erfüllen.

FILTER

Gibt die Menge, die von Filtern einen spezifizierten Satz auf einer Suchbedingung basierte führt.

Beispiel:

SELECT NON EMPTY 
{ 
    [Measures].[Score %] 
    ,[Measures].[Month Key] 
} ON COLUMNS, 
NON EMPTY 
{ 
    ([Date].[YMD].[Month Name].&[201301] : [Date].[YMD].[Month Name].&[201307]) 
    * 
    FILTER 
    (
     [Customer].[Customer Full Name].[Customer Full Name].members, 
     [Measures].[Score %] <> null 
     AND 
     [Measures].[Score %] <> 0 
    ) 
} ON ROWS 
FROM [Cube] 

Hinweis in der obigen MDX-Abfrage gibt es eine Crossjoin zwischen Monaten 201301-201307 und einigen Mitgliedern, die die Kriterien in der Filterfunktion erfüllen. Die Kriterien in diesem Fall ist, dass die Score % der Mitglieder nicht null sein kann AND nicht Null sein kann.

Es soll wie folgt produzieren:

MonthName Customer Full Name Score % Month Key 

201301  Customer1   5%  1000 
201301  Customer2   3%  1000 
201304  Customer1   8%  3500 
201306  Customer1   11%  2200 
201307  Customer2   13%  3400 

Hinweis Monate 201302, 201303 und 201305 im Ergebnis nicht vorhanden sind, weil die Kunden in diesen Monaten haben die Filterkriterien nicht erfüllen.

Hoffentlich wird dies Ihnen helfen.

+0

Wenn ich versuche, auf die EMPLID in der WHERE-Klausel zu verweisen, bekomme ich diesen Fehler "' Die Emplid-Hierarchie erscheint bereits in der Axis1-Achse. – StevenWhite

+0

Teilen Sie die MDX, ich denke, Sie versuchen, Emplid auf Zeilen auszuwählen und zu filtern in der Slicer-Where-Klausel –

+0

'SELECT NON EMPTY {[Measures]. [Mitarbeiteranzahl]} ON COLUMNS , NICHT LEER {([Person]. [Emplid]. [Emplid] .ALLMEMBERS * [Person]. [Zuerst Name]. [Vorname] .ALLMEMBERS * [Person]. [Nachname]. [Nachname] .ALLMEMBERS)} Bemaßungseigenschaften MEMBER_CAPTION, MEMBER_UNIQUE_NAME ON ROWS FROM [Model] WHERE STRTOMEMBER ('[Person]. [Emplid]. & [123] ') ' – StevenWhite

Verwandte Themen