Subselects only support the COLUMNS axis - mdx

Subselects only support the COLUMNS axis.
SELECT NON EMPTY { [Measures].[Total Due] } ON COLUMNS,
TopCount ({[Store].[Name].Members *[Customer].[Store ID 1].Members }
,5,
[Measures].[Total Due]) ON ROWS
FROM [TOP_5]

Subselects support as many axes as you like - in fact the subselect is one of the occasions where you can practically use more than two axes.
SELECT
[Sales Territory].[Sales Territory Region].MEMBERS ON 0
,[Date].[Calendar].[Calendar Year].MEMBERS ON 1
FROM
( //<< subselect starts here
SELECT
[Sales Territory].[Sales Territory Region].[Canada] ON 0
,[Product].[Product].[Mountain-200 Black, 42] ON 1
,[Promotion].[Promotion Type].[No Discount] ON 2
,[Date].[Calendar].[Calendar Year].[CY 2008] ON 3
FROM [Adventure Works]
) //<< subselect ends here
WHERE
[Measures].[Sales Amount];
Did you try the WITH clause
WITH SET [X] AS
TopCount (
{[Store].[Name].Members *[Customer].[Store ID 1].Members }
,5
,[Measures].[Total Due]
)
SELECT
NON EMPTY { [Measures].[Total Due] } ON COLUMNS,
[X] ON ROWS
FROM [TOP_5];

Related

I'm stuck with MDX query

i need sales amount of first month of each quarter
WITH SET [FIRSTMONTHOFQTR] AS
DESCENDANTS(
DESCENDANTS(
[Date].[Calendar].CURRENTMEMBER,
[Date].[Calendar].[Calendar Quarter]
),
[Date].[Calendar].[Month]
)
SELECT {
[Measures].[Sales Amount]
} ON COLUMNS,
{
[FIRSTMONTHOFQTR]
} ON ROWS
FROM [Adventure Works];
With above im getting each month but i need only first month. how can i filter that?
This is one approach:
WITH
SET [Qtrs] AS
[Date].[Calendar].[Calendar Quarter]
SET [FIRSTMONTHOFQTR] AS
Generate
(
[Qtrs] AS s
,Head(Descendants(s.CurrentMember,[Date].[Calendar].[Month]))
)
SELECT
{[Measures].[Sales Amount]} ON COLUMNS
,[FIRSTMONTHOFQTR] ON ROWS
FROM [Adventure Works];
It returns the following:

Sum of Previous months Sales with MDX

The below query works okay.
With Member PyMonthSales as
SUM(PARALLELPERIOD([Date].[Calendar].[Month], 1),[Measures].[Internet Sales Amount])
select
{PyMonthSales} on Columns,
[Date].[Calendar].[Month] on Rows
FROM
(
Select {
[Date].[Calendar].[Month].&[2006]&[5], [Date].[Calendar].[Month].&[2006]&[4]
} on Columns
From [Adventure Works]
)
But I just want one Grand total. So I removed the rows, on the above query
With Member PyMonthSales as
SUM(PARALLELPERIOD([Date].[Calendar].[Month], 1),[Measures].[Internet Sales Amount])
select
{PyMonthSales} on Columns
FROM
(
Select {
[Date].[Calendar].[Month].&[2006]&[5], [Date].[Calendar].[Month].&[2006]&[4]
} on Columns
From [Adventure Works]
)
This is where the problem starts. Returns null. Any assistance would be great.
Thanks for your time.
Naz
It ended up a bit messy!!
WITH
MEMBER [Measures].x AS
Aggregate
(
Generate
(
{
[Date].[Calendar].[Month].&[2006]&[5]
,[Date].[Calendar].[Month].&[2006]&[4]
}
,{
ParallelPeriod
(
[Date].[Calendar].[Month]
,1
,[Date].[Calendar].CurrentMember
)
}
)
,[Measures].[Internet Sales Amount]
)
SELECT
x ON 0
FROM [Adventure Works];
The thing I kept forgetting was the curly brackets around the ParallelPeriod section - without those an exception is raised because Generate always wants a SET as its second argument.

How to apply Hierarchize and Order by with MDX Query

I need to order Dimension with respect to descending order. without using HIERARCHIZE key word everything works fine. here i need HIERARCHIZE in order to order hierarchy level data.
Select NON EMPTY({[Measures].[Internet Sales Amount]}) dimension properties MEMBER_TYPE,CHILDREN_CARDINALITY, PARENT_UNIQUE_NAME ON COLUMNS ,NON EMPTY(HIERARCHIZE({{ORDER(drilldownlevel([Customer].[Customer Geography]),[Customer].[Customer Geography].CurrentMember.MEMBER_CAPTION,desc)}})) dimension properties MEMBER_TYPE,CHILDREN_CARDINALITY, PARENT_UNIQUE_NAME ON ROWS
Unfortunely I do not have AdvWrks cube to test the following:
SELECT
NON EMPTY
[Measures].[Internet Sales Amount] ON 0
,NON EMPTY
ORDER(
{
HIERARCHIZE([Customer].[Customer Geography].[COUNTRY].MEMBERS)
,[Customer].[Customer Geography].[COUNTRY].&[GERMANY].CHILDREN
}
,[Customer].[Customer Geography].CurrentMember.MEMBER_CAPTION
,BDESC
)
) ON 1
FROM [Adventure Works];
Looks like I had a tested solution to a similar problem here:
Issue with Order function and Crossoins in MDX
Looks like an application of the above to your context is something like this:
SELECT
NON EMPTY
[Measures].[Internet Sales Amount] ON 0
,NON EMPTY
{
Order
(
{
[Customer].[Customer Geography].[COUNTRY].MEMBERS
, [Customer].[Customer Geography].[COUNTRY].&[GERMANY].CHILDREN
}
,(
[Measures].[Internet Sales Amount]
,[Customer].[Customer Geography].[COUNTRY]
)
,BDESC
)
} ON 1
FROM [Adventure Works];
Resolved the issues with below query
SELECT
NON EMPTY [Measures].[Internet Sales Amount] ON 0,
NON EMPTY
Order(
Hierarchize(
[Customer].[Customer Geography].[Country].&[Germany].Children
)
,[Customer].[Customer Geography].CurrentMember.MEMBER_CAPTION
,DESC
)
ON 1
FROM [Adventure works];

Creating a measure by filtering out a set from an existing measure

I am trying to implement something as follows:
WITH MEMBER Measures.Test2 AS
Sum
(
{
[Date].[Calendar].[Calendar Year].&[2006]
,[Date].[Calendar].[Calendar Year].&[2007]
}
,[Measures].[Internet Sales Amount]
)
SELECT Measures.Test2 ON COLUMNS
FROM [Adventure Works];
But i want the new measure Test2 to be sliceable according to the Calendar Year dimension. So i want something like
SELECT {Measures.Test2} ON 0,
{[Date].[Calendar].[Calendar Year].[Calendar Year].MEMBERS} ON 1
FROM [Adventure Works];
This is giving the same value for both the years 2006 and 2007.
In essence i want to create a member by taking a subset of an existing measure and then using it for further calculations
This script is not valid mdx:
SELECT (Measures.Test2,[Date].[Calendar].[Calendar Year].[Calendar Year] ON COLUMNS
FROM [Adventure Works];
You have a single ( before Measures.
Also you look like you're about to add a tuple ON COLUMNS which is not allowed. Only sets are allowed on rows and columns:
SELECT
{Measures.Test2} ON 0,
{[Date].[Calendar].[Calendar Year].[Calendar Year].MEMBERS} ON 1
FROM [Adventure Works];
Try the following:
WITH
MEMBER Measures.Test2 AS
Sum
(
Intersect
(
{[Date].[Calendar].CurrentMember}
,{
[Date].[Calendar].[Calendar Year].&[2006]
,[Date].[Calendar].[Calendar Year].&[2007]
}
)
,[Measures].[Internet Sales Amount]
)
SELECT
[Measures].test2 ON COLUMNS
,{[Date].[Calendar].[Calendar Year].MEMBERS} ON ROWS
FROM [Adventure Works];
The above returns this:
Or maybe all you want is a subselect:
SELECT
[Measures].[Internet Sales Amount] ON COLUMNS
,{[Date].[Calendar].[Calendar Year].MEMBERS} ON ROWS
FROM
(
SELECT
{
[Date].[Calendar].[Calendar Year].&[2006]
,[Date].[Calendar].[Calendar Year].&[2007]
} ON 0
FROM [Adventure Works]
);

Elegant way to ignore null when applying RANK

This article gives a method for ignoring null when applying RANK : http://www.bidn.com/blogs/CraigLove/ssas/2617/mdx-walkthrough
Is there a more elegant way of doing this than using CASE ?
WITH
MEMBER [Measures].[City Rank]
AS
CASE
WHEN
NOT ISEMPTY
(
(
[Geography].[City].CurrentMember
,[Measures].[Reseller Sales Amount]
)
)
THEN
RANK
(
[Geography].[City].CurrentMember
,[Geography].[City].AllMembers
,[Measures].[Reseller Sales Amount]
)
ELSE
NULL
END
SET [OrderedCity]
AS
ORDER
(
[Geography].[City].AllMembers
,[Measures].[Reseller Sales Amount]
,DESC
)
SELECT
{
[Measures].[City Rank]
,[Measures].[Reseller Sales Amount]
} ON COLUMNS
,NON EMPTY [OrderedCity] ON ROWS
FROM [Adventure Works];
You could apply the NonEmpty function within OrderedCity:
WITH
SET [OrderedCity]
AS
NonEmpty(
ORDER
(
[Geography].[City].AllMembers
,[Measures].[Reseller Sales Amount]
,DESC
)
)
MEMBER [Measures].[City Rank]
AS
RANK
(
[Geography].[City].CurrentMember
,[OrderedCity]
)
SELECT
{
[Measures].[City Rank]
,[Measures].[Reseller Sales Amount]
} ON COLUMNS
,[OrderedCity]
ON ROWS
FROM [Adventure Works];
This way the NON EMPTY is applied on the set on the rows before it it put there, so there is no need to apply it on the rows themselves. Furthermore, re-using the set within the definition of City Rank allows Analysis Services to calculate the sorting only once, and cache the ordered set. Otherwise, the Rank would require the ordering to be re- calculated for each row.