Ich versuche, alle Aufzeichnungen zwischen dem aktuellen Datum und 30 Tagen herauszufinden. Kann aber keinen MDX-Filter dafür schreiben. Meine aktuelle Anfrage lautet:

 WITH
  SET [~FILTER] AS
     {[Created_Date.Created_Hir].[Created_On].Members}
 SET [~ROWS] AS
    {[Sales Order Attributes SO.Sales_order].[Sales Order ID].Members}
    SELECT
   NON EMPTY {[Measures].[CONT_AMT_GROSS]} ON COLUMNS,
   NON EMPTY [~ROWS] ON ROWS
   FROM [SALES_ORDER]
   WHERE [~FILTER]

Das holt alle Datensätze.

1
mt_leo 23 Dez. 2015 im 09:16

2 Antworten

Beste Antwort

Hier ist ein Beispiel für die heutige Suche im AdvWrks-Cube zusammen mit den 30 vorhergehenden Tagen:

WITH 
  MEMBER [Measures].[Key for Today] AS 
    Format
    (
      Now()
     ,'yyyyMMdd'
    ) 
  MEMBER [Measures].[Key for Today (AW)] AS 
    '2007' + Right([Measures].[Key for Today],4) 
  MEMBER [Measures].[Today string] AS 
    '[Date].[Calendar].[Date].&[' + [Measures].[Key for Today (AW)] + ']' 
  SET [Today] AS 
    StrToMember
    (
      [Measures].[Today string]
     ,constrained
    ) 
  SET [Last30Days] AS 
    [Today].Item(0).Item(0).Lag(30) : [Today].Item(0).Item(0) 
SELECT 
  {} ON 0
 ,[Last30Days] ON 1
FROM [Adventure Works];

Ergebnisse in diesem:

enter image description here

Wenn wir also das oben Gesagte so ändern wollten, dass wir nur in den letzten 30 Tagen einen Internetverkaufsbetrag erhalten:

WITH 
  MEMBER [Measures].[Key for Today] AS 
    Format
    (
      Now()
     ,'yyyyMMdd'
    ) 
  MEMBER [Measures].[Key for Today (AW)] AS 
    '2007' + Right([Measures].[Key for Today],4) 
  MEMBER [Measures].[Today string] AS 
    '[Date].[Calendar].[Date].&[' + [Measures].[Key for Today (AW)] + ']' 
  SET [Today] AS 
    StrToMember
    (
      [Measures].[Today string]
     ,constrained
    ) 
  SET [Last30Days] AS 
    [Today].Item(0).Item(0).Lag(30) : [Today].Item(0).Item(0) 
  MEMBER [Date].[Calendar].[All].[Last30Days] AS 
    Aggregate([Last30Days]) 
SELECT 
  {[Measures].[Internet Sales Amount]} ON 0
FROM [Adventure Works]
WHERE [Date].[Calendar].[All].[Last30Days];

Bei Anwendung auf Ihr Szenario würde das Obige ungefähr so aussehen:

WITH 
  MEMBER [Measures].[Key for Today] AS 
    Format
    (
      Now()
     ,'yyyyMMdd'
    ) 
  MEMBER [Measures].[Today string] AS 
    '[Created_Date.Created_Hir].[Created_On].&[' + [Measures].[Key for Today] + ']' 
  SET [Today] AS 
    StrToMember
    (
      [Measures].[Today string]
     ,constrained
    ) 
  SET [~FILTER] AS 
    [Today].Item(0).Item(0).Lag(30) : [Today].Item(0).Item(0) 
  MEMBER [Created_Date.Created_Hir].[All].[~FILTERaggregated] AS 
  //MEMBER [Created_Date.Created_Hir].[Created_On].[All].[~FILTERaggregated] AS //<<if above is throwing an exception then try this instead
    Aggregate([~FILTER]) 
  SET [~ROWS] AS 
    {
      [Sales Order Attributes SO.Sales_order].[Sales Order ID].MEMBERS
    } 
SELECT 
  NON EMPTY 
    {[Measures].[CONT_AMT_GROSS]} ON COLUMNS
 ,NON EMPTY 
    [~ROWS] ON ROWS
FROM [SALES_ORDER]
WHERE 
  [Created_Date.Created_Hir].[All].[~FILTERaggregated];
0
whytheq 23 Dez. 2015 im 14:59

Das Folgende sollte als Datumsfilter funktionieren.

Filter 
    ( 
     [Created_Date].[Created_Hir].[Created_On].Members, 
     DateDiff 
        ( 
         "d", 
         CDate([Created_Date].[Created_Hir].MEMBER_VALUE), 
         Now() 
        ) <=30 
    ) 

Verwenden Sie keinen benannten Satz wie im Beispiel, wenn Sie nicht auf Leistungsprobleme stoßen möchten.

Lassen Sie mich wissen, wenn die Leistung nicht gut genug ist.

1
SouravA 23 Dez. 2015 im 12:30