Search code examples
ssasmdxcubes

MDX Start and End Time per transaction


I hope you can help i have tried so many way to try get this right with no luck. I am trying to get out the player account number the date and start and end date time and maybe calculate the play duration between the start and end times.

I would like the output to look something like this.

PlayerAccount | GamingDate | StartTime | EndTime | PlayDuration | ActualWin

I always seem to return the start and end time for the whole day and not Per account.

 WITH 
  SET [MySet] AS 
      [Customer].[Player Account Number].Children*
      Head
      (
        NonEmpty
        (
          [Start Time].[Hour].Children
         ,[Measures].[Actual Win]
        )
       ,1
      )*
      Tail
      (
        NonEmpty
        (
          [End Time].[Hour].Children
         ,[Measures].[Actual Win]
        )
       ,1
      ) 
SELECT 
  {[Measures].[Actual Win]} ON 0
 ,{[MySet]} ON 1
FROM 
(
  SELECT 
      [Customer].[Player Account Number].&[1040002184]
    : 
      [Customer].[Player Account Number].&[1040002198] ON 0
  FROM Ratings
)
WHERE 
  {[Gaming Date].[Full Date].&[20150101]};

Solution

  • Usually first date and last date would be measures. If you only want results for those two player then use the WHERE clause rather than a sub-select:

    WITH 
      MEMBER [Measures].[fDate] AS 
        Head
        (
          NonEmpty
          (
            [Start Time].[Hour].MEMBERS
           ,[Measures].[Actual Win]
          )
        ).Item(0).Item(0).Member_Caption 
      MEMBER [Measures].[lDate] AS 
        Tail
        (
          NonEmpty
          (
            [End Time].[Hour].MEMBERS
           ,[Measures].[Actual Win]
          )
        ).Item(0).Item(0).Member_Caption 
    SELECT 
      {
        [Measures].[fDate]
       ,[Measures].[lDate]
       ,[Measures].[Actual Win]
      } ON 0
     ,{[Customer].[Player Account Number].Children} ON 1
    FROM Ratings
    WHERE 
      ([Gaming Date].[Full Date].&[20150101],
       { [Customer].[Player Account Number].&[1040002184]
        ,[Customer].[Player Account Number].&[1040002198]});
    

    This is a working AdvWrks script which does the sort of thing you're trying to achieve:

    WITH 
      MEMBER [Measures].[firstDate] AS 
        Head
        (
          NonEmpty
          (
            [Date].[Date].[Date].MEMBERS
           ,[Measures].[Internet Sales Amount]
          )
        ).Item(0).Item(0).Member_Caption 
      MEMBER [Measures].[lastDate] AS 
        Tail
        (
          NonEmpty
          (
            [Date].[Date].[Date].MEMBERS
           ,[Measures].[Internet Sales Amount]
          )
        ).Item(0).Item(0).Member_Caption 
    SELECT 
      {
        [Measures].[Internet Sales Amount]
       ,[Measures].[firstDate]
       ,[Measures].[lastDate]
      } ON 0
     ,NON EMPTY {[Promotion].[Promotion].MEMBERS} ON 1
    FROM [Adventure Works];
    

    If you'd rather pull back a member instead of using Measures I think the GENERATE function will work like this AdvWrks example:

    WITH 
      SET [aSet] AS 
        Generate
        (
          [Promotion].[Promotion].MEMBERS
         ,
            [Promotion].[Promotion].CurrentMember
          * 
            Head
            (
              NonEmpty
              (
                [Date].[Date].[Date].MEMBERS
               ,[Measures].[Internet Sales Amount]
              )
            )
        ) 
    SELECT 
      {[Measures].[Internet Sales Amount]} ON 0
     ,NON EMPTY 
        {[aSet]} ON 1
    FROM [Adventure Works];