How to calculate the a 4 month cumulative value via mdx? [closed] - mdx

Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 5 years ago.
Improve this question
How to calculate cumulative value for last 3 months + the current month value, in an mdx query?
If I select May then it will give the cumulative value of this set {Feb, March, April, May}

If you need to cover distinct counts as well as sums then AGGREGATE is the function to use but if distinct counts are not needed then you can simply use SUM.
If you have a month selected, or months ON ROWS then to return the month selected then something like the following should work:
[Date].[Date - Calendar Month].CurrentMember
To then go back 3 months you can add the LAG function:
[Date].[Date - Calendar Month].CurrentMember.LAG(3)
Now to get this range of months use the : operator:
[Date].[Date - Calendar Month].CurrentMember.LAG(3)
:
[Date].[Date - Calendar Month].CurrentMember
So this could now beused against a specific measure e.g. Revenue like this:
SUM(
[Date].[Date - Calendar Month].CurrentMember.LAG(3)
:
[Date].[Date - Calendar Month].CurrentMember
,[Measures].[Revenue]
)
In a script this would be added to a WITH clause:
WITH
MEMBER [Measures].[4MonthRevenue] AS
SUM(
[Date].[Date - Calendar Month].CurrentMember.LAG(3)
:
[Date].[Date - Calendar Month].CurrentMember
,[Measures].[Revenue]
)
SELECT
[Date].[Date - Calendar Month].[Calendar Month].MEMBERS
ON ROWS,
NON EMPTY
[Measures].[4MonthRevenue]
ON COLUMNS
FROM [YourCube];

I've posted a really helpful article for this case:
Aggregate(
LastPeriods(
3,
StrToMember('[Date].[Calendar].[Month].&[' + Format(Now(),'yyyyMM') + ']')
),
[Measures].[YourNotCalulatedMeasure]
)

Related

How to calculate a YTD based on the Month short

I have hierarchy: Month,Monthshort and Year-Quarter-Month under TimeDim Dimension,a scope is available like below to calculate YearToDate(YTD)
Scope([TimeDim].[Year - Quarter - Month].[Month].members, [TimeDim].[Month].Members);
YTD:
([TimeDim].[YTD]=
Sum(
CrossJoin(
{[Time Calculation].[Current Period]},
PeriodsToDate([TimeDim].[Year - Quarter - Month].[Year],
[Timedim].[Year - Quarter - Month].CurrentMember
)
)
)
);
Month will be in format YYYY-MM fullname(eg: 2017-10 October) and Month short will be MMM(Oct). If I calculate YTD on the measure based on month it works fine,
How to calculate YTD based on Month Short? Do I require to create new scope to calulate YTD based on Month short? I am new to SSAS. Please help
Yes, this requires new SCOPE.
Because current scope contains Year "anchor" here: [TimeDim].[Year - Quarter - Month].[Year].
Answer will be updated once all additional questions answered
I created below scope for YTD with month short. Thus solved the problem.
Scope([Time Year Month].[Year].members,[Time Year Month].[Year - Month].[Month Short].members);
-- accumulated YTD CALCULATIONS
([Time Calculation].[YTD]=
SUM(
CrossJoin(
{[Time Calculation].[Current Period]},
PeriodsToDate([Time Year Month].[Year - Month].[Year]
)
)
)
);
End Scope;

MDX Syntax to retrieve Specific Dates

I am building some reports in Pyramid Analytics. I created a custom set and tried to write a MDX query which will retrieve the first day of the first month for the first three quarters of the previous year, selected in the slicer. i.e.
If I choose in my slicer 2017, I expect to see the following in the body of the report: Jan 1st 2016, April 1st 2016 and July 1st 2016. These will change according to the selection in the slicer.
I only got as far as the syntax below, which only returns first day of the first month of the first quarter of the previous year i.e. Jan 1st 2016
[Policy - Inception Date].[Calendar Hierarchy].[!#NewPar#!].PREVMEMBER.FIRSTCHILD.FIRSTCHILD.FIRSTCHILD
Note:Newpar = Parameter
Can you please help with the correct syntax?
Thanks.
Without knowing the structure of your Date dimension I'm having to use some guess work but I've made the following in Pyramid and it works fine against our cube:
Generate
(
Head //<<<this will get the first 3 quarters
(
Descendants
(
{[Date].[Date - Calendar Month].[!#aYear#!].PrevMember} //<<<this will get the previous year
,[Date].[Date - Calendar Month].[Calendar Quarter]
)
,3
)
,Head //<<<this will get the first day of each of the quarters found in the first argument of the generate function
(
Descendants
(
[Date].[Date - Calendar Month].CurrentMember
,[Date].[Date - Calendar Month].[Calendar Day]
)
,1
)
)
Here is the result with the year parameter in the top left:

SUM of a YTD-value by Year for several selected years

I am trying to put together an SQL statement that returns the SUM of a value by Year for several selected years, but on a year to date basis. In other words, running the report by selecting years I need the value for the selected years on a year to date basis. This could be something like this: By selecting the years 2015, 2014 until 2010 the Report should give 2015 value ytd of 25.02.2015, 2014 ytd of 25.02.2014 and so on.
Yet I only figured out how to select the Dates for each year to date value manually., but clearly the I was thinking. However, I was hoping to have some of this work handled with my SQL Statement using the selected years Parameter and add month and day somehow.
Has anyone ever tackled this type of problem with an SQL statement, and if so, what is the trick that I am missing?
My current sql statement for ytd data is similar to the following:
SELECT NON EMPTY { [Measures].[Sales Turnover YTD], [Measures].[Order Intake YTD] } ON COLUMNS FROM ( SELECT ( STRTOSET(#DateDate, CONSTRAINED)
This works perfectly for the one year, but still I am seeking the solution for several years.
As described above my desired result would be: after choosing several fiscal years (e.g. 2010-2015) I will get following values:
2015 Sales Turnover YTD Order Intake YTD on date today
2014 Sales Turnover YTD Order Intake YTD on date today one year ago
and so on..
Here is a script against AdvWrks that calculates the equivalent YTD totals for each of the years ON ROWS:
WITH
SET [NonEmptyDates] AS
NonEmpty([Date].[Calendar].[Date].MEMBERS)
SET [LastNonEmptyDate] AS
Tail([NonEmptyDates])
SET [SetDaysInCurrentYear] AS
Descendants
(
Exists
(
[Date].[Calendar].[Calendar Year]
,[LastNonEmptyDate].Item(0).Item(0)
).Item(0)
,[Date].[Calendar].[Date]
)
MEMBER [Measures].[NumDaysInCurrentYear] AS
Rank
(
[LastNonEmptyDate].Item(0)
,[SetDaysInCurrentYear]
)
MEMBER [Measures].[EquivYTD] AS
Aggregate
(
Head
(
Descendants
(
[Date].[Calendar].CurrentMember
,[Date].[Calendar].[Date]
)
,[Measures].[NumDaysInCurrentYear]
)
,[Measures].[Internet Sales Amount]
)
SELECT
{
[Measures].[Internet Sales Amount]
,[Measures].[EquivYTD]
} ON 0
,[Date].[Calendar].[Calendar Year] ON 1
FROM [Adventure Works];

MDX: How to access currently selected dimension members?

I'm trying to create a measure in MDX to get the first day in the selected period (I have a YMD date dimension). I'm using EXISTING function to get the selected members. It's working fine if I only select one dimension member in Excel pivot table filter. However, as soon as I select multiple members (Example: 2012 & 2013 together), the EXISTING function is not working as expected.
I've created another measure to debug and see what is going on. The measure is defined as:
SetToStr(EXISTING([Date].[Date YMD].[Year].members))
If I have only one dimension member selected, this works fine, I get this back:
{[Date].[Date YMD].[All].[2013]}
However, as soon as I select 2012 and 2013 together, I get a list of all dimension members back:
{[Date].[Date YMD].[All].[N/A],[Date].[Date YMD].[All].[2007],[Date].[Date YMD].[All].[2008],[Date].[Date YMD].[All].[2009],[Date].[Date YMD].[All].[2010],[Date].[Date YMD].[All].[2011],[Date].[Date YMD].[All].[2012],[Date].[Date YMD].[All].[2013],[Date].[Date YMD].[All].[2014]}
The EXISTING function seems to work only when a single member is selected?
--
Update:
Maybe I was not clear enough in the original post. The problem I'm facing is getting the first and last date member if the date dimension is being filtered (in an Excel pivot table filter) and multiple date members are selected in the filter (example: when years 2012 & 2013 are selected together).
I've tried using the solution from here: http://bimic.blogspot.com/2011/07/mdx-rewrite-query-with-currentmember.html, but to no success.
I've created 2 measures now:
First Day Single:
HEAD(
DESCENDANTS(
[Date].[Date YMD].CURRENTMEMBER,
[Date].[Date YMD].[Day]
),
1
).ITEM(0).member_value
First Day Multiple Years
MIN(EXISTING [Date].[Date YMD].[Year].members, [Measures].[First Day Single])
Unfortunately I can't include a screenshot directly. You can see it on this link: http://social.msdn.microsoft.com/Forums/getfile/446659
As you can see, the measures work when a single year is selected in the pivot table filter, but don't work when you select more than one year.
In my cube and via management studio I can write a script like this to create measures that return numeric values based on the first day and last day of each month:
WITH
SET [Last12Months] AS
TAIL (
[Date].[Date - Calendar Month].[Calendar Month].members,
12)
MEMBER [Measures].[FirstDay] AS
HEAD(
DESCENDANTS(
[Date].[Date - Calendar Month].CURRENTMEMBER,
[Date].[Date - Calendar Month].[Calendar Day]
),
1
).ITEM(0).member_value
MEMBER [Measures].[LastDay] AS
TAIL(
DESCENDANTS(
[Date].[Date - Calendar Month].CURRENTMEMBER,
[Date].[Date - Calendar Month].[Calendar Day]
),
1
).ITEM(0).member_value
SELECT
{[Measures].[FirstDay],[Measures].[LastDay]} ON 0,
[Last12Months] ON 1
FROM [MyCube]
We use Office 2010 but using the OLAP Pivottables extensions add-in I can add the following two measures to my pivottable:
1.[Measures].[FirstDay]
HEAD(
DESCENDANTS(
[Date].[Date - Calendar Month].CURRENTMEMBER,
[Date].[Date - Calendar Month].[Calendar Day]
),
1
).ITEM(0).member_value
2.[Measures].[LastDay]
TAIL(
DESCENDANTS(
[Date].[Date - Calendar Month].CURRENTMEMBER,
[Date].[Date - Calendar Month].[Calendar Day]
),
1
).ITEM(0).member_value
Now whatever I use in Rows I get the correct answer from the pivot:
EDIT
If I manipulate the pivot so that our date dimension is in the pivot's filter and then go for multi-select of 2013 and 2014 it seems that the `mdx' which excel is using is the following:
WITH
MEMBER [Measures].[FirstDay] as
HEAD (
DESCENDANTS ( [Date].[Date - Calendar Month].CURRENTMEMBER, [Date].[Date - Calendar Month].[Calendar Day] )
, 1
).ITEM( 0 ).member_value
MEMBER [Measures].[LastDay] as
TAIL (
DESCENDANTS ( [Date].[Date - Calendar Month].CURRENTMEMBER, [Date].[Date - Calendar Month].[Calendar Day] )
, 1
).ITEM( 0 ).member_value
SELECT
{ [Measures].[FirstDay], [Measures].[LastDay] } ON COLUMNS
FROM
(
SELECT
({ [Date].[Date - Calendar Month].[Calendar Year].&[2012],
[Date].[Date - Calendar Month].[Calendar Year].&[2013] }) ON COLUMNS
FROM [OurCube]
)
I think the context of the function CURRENTMEMBER in the custom measures of this script will be lost because of the sub-select.
There is a workaround for your problem described here: http://sqlblog.com/blogs/mosha/archive/2007/09/26/how-to-detect-subselect-inside-mdx-calculations-aka-multiselect-in-excel-2007.aspx. But, as the writer (one of the developers of SSAS) writes, " the solution is neither elegant nor efficient". Anyway, it needs another measure group to be added to the cube, and a stored procedure to be written.
Really old topic, but I am posting my solution here as I haven't found the solution elsewhere:
Using dynamic set seems to have done the trick for me as will be populated only with members in context:
CREATE DYNAMIC SET [LastUpdateSet]
AS
TAIL(
NONEMPTY(
[LastUpdateDate].[Date].ALLMEMBERS
, [Measures].[Quantity]
)
, 1)
;
CREATE MEMBER CURRENTCUBE.[Measures].[LastUpdateQuantity]
AS (
[LastUpdateSet].item(0)
, [Measures].[Quantity]
)
;

Using the ANCESTOR function on a DATE dimension

Here is my script:
WITH MEMBER [Date].[Date - Calendar Month].[2MthPrev] AS
(
ANCESTOR(
CLOSINGPERIOD([Date].[Date - Calendar Month].[Calendar Month]),
2
))
SELECT
NON EMPTY
{
[Date].[Date - Calendar Month].[2MthPrev]
}
ON ROWS,
NON EMPTY
[Measures].[Revenue]
ON COLUMNS
FROM [OurCube]
The query runs with no error but the result pane is empty.
I've attempted to create a custom member in the [Date - Calendar Month] hierarchy that is two months previous to the last month in the hierarchy's level [Calendar Month]. So if the last loaded month in the cube is July 2013 then I'd hope that [2MthPrev] would show the results from May 2013.
I believe the problem is with the custom member [2MthPrev] and its use of ANCESTOR - how is this fixed?
This query returns 2 months prior from the last populated date for the given measure group. You may have to fiddle with it to make a calculated member. The second argument in tail is optional. If you don't include it, the default value is 1.
So I'm returning the item that is 2 prior to (lag) the first item (Item(0)) of the set which includes the last month (tail) from the set of months for which there are values in the Measure Group (exists clause).
select {Tail(Exists([Date].[Date - Calendar Month].[Calendar Month].members, , "Measure Group Name")).Item(0).lag(2)} on 0
from [OurCube]
Not sure to understand the query but assuming [Calendar Month] is having at most 2 levels (ALL + months) I guess you're asking for something like :
[a-month].parent.parent = [all].parent = null
[2MthPrev] is a scalar value and not a member; if you want to debug to sth like:
with [2MthPrev] as ancestor( ... ).uniqueName
Hope that helps.