0
votes

With the below MDX queries I am attempting to return a comparison of sales figures.

I want to compare YTD with LYTD, defined as follows:

YTD: 01 Jan this year (01/Jan/2011) until today (17/Aug/2011)

LYTD: 01 Jan last year (01/Jan/2010) until today's date last year (17/Aug/2010)

Both periods should contain the same number of days (give or take one day for leap years).

So far I have tried using the YTD() function to get this year's data but I have not had much success with wrapping the YTD() function in something to get it to return the same dates from last year. I have employed LAG(1) and ParallelPeriod (see both examples below):

WITH
MEMBER [Measures].[Sales YTD] AS
    'SUM(YTD(),[Measures].[Sales])'
MEMBER [Measures].[Sales LYTD] AS
    'SUM((YTD(),[Measures].[Sales]).LAG(1))'
SELECT
    {[Sales YTD], [Sales LYTD]} ON COLUMNS
    ...

Or

WITH
MEMBER [Measures].[Sales YTD] AS
    'SUM(YTD(),[Measures].[Sales])'
MEMBER [Measures].[Sales LYTD] AS
    'SUM(ParallelPeriod(YTD(),1),[Measures].[Sales])'
SELECT
    {[Sales YTD], [Sales LYTD]} ON COLUMNS
    ...

The resulting data when using either ParallelPeriod or LAG always returns a column of nulls for Last Year's sales:

Customer    Sales YTD  Sales LYTD
ABC Screws      $1024       (Null)
ABC Bolts       $2392       (Null)
ABC Nuts        $3735       (Null)

Can anybody suggest changes to the query which will return the correct data, or perhaps offer an alternative strategy to using LAG or ParallelPeriod?

2

2 Answers

0
votes

use something like that:

WITH
        MEMBER [Measures].[Sales YTD] AS
            'SUM(YTD(closingperiod([Date].[Calendar].[Date])),[Measures].[Sales])'
        MEMBER [Measures].[Sales LYTD] AS
            'SUM(YTD(PARALLELPERIOD([Date].[Calendar].[Calendar Year],1,closingperiod([Date].[Calendar].[Date]))),[Measures].[Sales])'
        SELECT
            {[Measures].[Sales YTD],[Measures].[Sales LYTD]} ON COLUMNS
        ...

, where

  • [Date].[Calendar].[Date] - level "Day" in your Date dimension;
  • closingperiod([Date].[Calendar].[Date]) - last member of this level "Day" (17/Aug/2011);
  • [Date].[Calendar].[Calendar Year] - level "Year" in your Date dimension;
  • PARALLELPERIOD([Date].[Calendar].[Calendar Year],1,closingperiod([Date].[Calendar].[Date])) - 17/Aug/2010.
0
votes

Not long after posting the question and further experimentation the following construction seemed to return the results I was looking for:

WITH
MEMBER [Measures].[Sales YTD] AS
    'SUM(YTD(),[Measures].[Sales])'
MEMBER [Measures].[Sales LYTD] AS
    'SUM(YTD(ParallelPeriod([Time].[Year],1,[Time].CURRENTMEMBER)),[Measures].[Sales])'
SELECT
    {[Sales YTD], [Sales LYTD]} ON COLUMNS
    ...

I would have posted my answer yesterday evening but users with less than 100 points have to wait 8 hours before they can answer their own questions.

@Max Thanks for your input, looks like you had the same idea. Therefore you get the accepted answer even though I'm using my own for the implementation.