Is it possible to generate all months to rows with MDX query?
It look like this if you are using postgresql
TO_CHAR((current_date - interval '1 month' * a),'MM') AS months
Any idea how to do that with MDX?
depending on the confiduration of the cube it can also be very simple:
select [Date].[Calendar].[Month].members on 0,
{} on 1
FROM [Adventure Works]
Philip,
Related
I have a Cube with a Date dimension hierarchy (Calendar,Year,Month,Week,Day) and Measure as SalesData, would like to add a calculated measure which would give me the SalesData for the selected date and the last date of the Previous Month.
Calendar Hierarchy is as follows
Date - Dimension
Calendar - Hierarchy
Year - [Date].[Calendar].[Year]
Quarter - [Date].[Calendar].[Quarter]
Month - [Date].[Calendar].[Month]
Week - [Date].[Calendar].[Week]
Day - [Date].[Calendar].[Day]
Measures
[Sales]
New Calculated Member need to be created - say [SalesMTD]
Requirement is when a user select any date say 3 March 2016, the calculated member should give Sales as follows
[SalesMTD] = [Sales] on 3 March 2016 - [Sales] on 29 Feb 2016
Can someone please help me write an MDX query for the Calculated Measure ?
Your help much appreciated.
Please try the below code.
CREATE MEMBER CURRENTCUBE.[Measures].[Sales Last Month]
AS ([Date].[Months].CURRENTMEMBER.PREVMEMBER, [Measures].[sales])
, VISIBLE = 1 ;
Then write another calculation using the above calculations
CREATE MEMBER CURRENTCUBE.[Measures].[Sales Difference]
AS ([Measures].[Revenue]-[Measures].[Sales Last Month])
, VISIBLE = 1 ;
with member measures.SalesDataLastDaylasMonth
as
[Date].[Calendar].currentmember.firstsibling.lag(1)
//or [Date].[Calendar].currentmember.firstsibling.prevmember
select {measures.SalesData, measures.SalesDataLastDaylasMonth} on 0,
[Date].[Calendar].[Day].members on 1
from [Some Cube]
Here currentmember.firstsibling.prevmember fetches the member prior to the first day in the list of days in the current month.
Also, you can obviously create this member in a cube instead of having it query scoped like this. The syntax would be similar to the above answer.
Based upon your edit
There are multiple ways of getting to it. Below are some:
with member Measures.[SalesMTD]
as
Measures.[Sales]
-
(Measures.[Sales],Ancestor([Date].[Calendar].currentmember, [Date].[Calendar].[Month]).firstchild.firstchild)
//(Measures.[Sales],[Date].[Calendar].currentmember.parent.parent.firstchild.firstchild.lag(1))
//(Measures.[Sales],[Date].[Calendar].currentmember.parent.parent.firstchild.firstchild.prevmember)
select Measures.[SalesMTD] on 0,
[Date].[Calendar].[Day].members on 1
from [Some Cube]
The first approach is the neatest.
In T-SQL I can retrieve ISO week number using dateprat function:
select datepart(iso_week, sysdatetime())
Is there an equivalent in MDX? I have troubles to find it.
I can retrieve number of week in MDX e.g. like this:
with member Measures.Test as (Format(now(), "yyyy") + cstr(datepart("ww", now())))
select Measures.Test on columns
from MyCube
But how about iso_week?
Thanks,
Petr
Please try below:
WITH
MEMBER [Measures].[Iso_week] AS Datepart("ww",NOW()-WeekDay(NOW(),2)+4,2,2)
SELECT [Measures].[Iso_week] ON 0
FROM [Some_cube]
More help here: http://www.snb-vba.eu/VBA_ISO_weeknummer_en.html
Referring the comment
I need to write a MDX query for a report, containing all weeks until the current ISO week
You can try the below:
with member
Measures.CurrentWeek as cstr(datepart("ww", now()))
member
WeekValue AS [Date].[Week].CURRENTMEMBER.MEMBER_VALUE
select
Measures.dummymeasures
ON 0,
[Date].[Week].[Week].MEMBERS HAVING WeekValue <= Measures.CurrentWeek
ON 1
FROM [YourCube]
WHERE ([Date].[Year].&[2016])
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]
)
;
I need to create a calculated member that calculates revenue for TTM (Trailing Twelve Months) associated to selected date (day level).
I tried something like this:
SUM(
{
[Accounting Effective Date].[Date Hierarchy].CurrentMember.Lag(365)
: [Accounting Effective Date].[Date Hierarchy].CurrentMember
},
[Measures].[Revenue]
)
But this doesn't work with leap year, for example if I pick 2013-01-01 than it returns 2012-01-02.
I have also tried this but this one is also not good since it takes first day of the month:
SUM(
{
[Accounting Effective Date].[Date Hierarchy].CurrentMember.Parent.Lag(12).FirstChild
: [Accounting Effective Date].[Date Hierarchy].CurrentMember
},
[Measures].[Revenue]
)
Date hierarhy is following:
Year > Quarter > Month > Date
the following query can help, it uses cousin function to return last years date.
with member [Measures].[TestValue] as
(cousin([Date].[Calendar].currentmember,[Date].[Calendar].currentmember.parent.parent.lag(1)),[Measures].[Internet Sales Amount])
member [Measures].[TestDate] as
cousin([Date].[Calendar].currentmember,[Date].[Calendar].currentmember.parent.parent.lag(1)).item(0).name
select
{[Measures].[Internet Sales Amount],[Measures].[TestValue],[Measures].[TestDate]}
on columns,
{
[Date].[Calendar].[Date].&[20130922]
}
on rows from
[adventure works]
I am new to MDX,
I have a requirement, which is using the measure on that Saturday as the default of that week, I have a time dimension [CALENDAR],
but there are multiple hierachies, different hierachies have different week start, that means in [CALENDAR].[h1].[DATE], the week start may be Thursday(weekday in nature calendar), in the other may be Sunday(in nature calendar),
so I have to using [CALENDAR].[DATE], which is nature calendar, I can get the corresponding Saturday,
with member measures.[Weekday]
as datepart('w',[CALENDAR].[Fiscal].currentmember)
member measures.[SatDay]
as dateadd('d'
,7-datepart('w',[CALENDAR].[Fiscal].currentmember.MemberValue)
,[CALENDAR].[Fiscal].currentmember.MemberValue)
select
{
[Measures].[Plan Count]
,measures.[Weekday]
,measures.[SatDay]
} on 0,
[CALENDAR].[Fiscal].[Date] on 1
from [MyCube]
but how can I the measure on that day?
Try a sub-select using your date hierarchy containing week (Year-Week-Date).
with member [Measures].[WeekDate] as
dateadd('d' ,7 - datepart('w',[Dim Date].[Year - Week - Date].currentmember.MemberValue)
,[Dim Date].[Year - Week - Date].currentmember.MemberValue)
select {[Measures].[WeekDate], [Measures].[Plan Count]} on 0,
[Dim Date].[Year - Week - Date].Children on 1
from (
select ([Dim Date].[Year - Week - Date].[Week]) on 0
from [cube]
where (
//filters if necessary
)
)