Solved

Problematic MDX query and getting descendents

Posted on 2008-06-10
7
853 Views
Last Modified: 2013-11-16
I am trying to figure out an issue with my MDX query.  I am fairly certain it is an issue with the data in the data warehouse because it works on some DWs, but not all, and they all have the same structure.  I am fairly new to MDX, and I am at a loss as to how to troubleshoot this further.   The error is that the cells cannot be created for this cellset because one of the axes contains no positions.  I am using Analysis Services 2000.

Here is the query:

WITH MEMBER [Measures].[Ranking] As ' Rank ( [OBR], { [Top10] } ) ' SET [Top10] As ' { TopCount ( {Filter ( {Descendants ( [OBR].[Compensation],2 ) }, ( ([Measures].[RRPayoutBasisAmount],[Dates Broker].[All Dates Broker].[2008]) <> 0 ) )},10, ( [Measures].[RRPayoutBasisAmount], [Dates Broker].[All Dates Broker].[2008] ) ) } ' SELECT { CrossJoin ( { [Dates Broker].[All Dates Broker].[2008] }, {[Measures].[Ranking], [Measures].[RRPayoutBasisAmount]}) } ON COLUMNS, { [Top10] } ON ROWS FROM [Payout]

If I change the way that it gets the Descendents to {Descendants ( [OBR].[Compensation],1, AFTER ) } it works correctly.  Also, if I change the filter criteria to =0 rather than <> 0 returns data, but not ordered correctly.


0
Comment
Question by:kerryhill
  • 3
  • 3
7 Comments
 
LVL 8

Expert Comment

by:srnar
ID: 21758319
What do you mean "not ordered correctly". For sorting there is as you know a sort function with BDESC (break descendants) flag.
0
 

Author Comment

by:kerryhill
ID: 21759866
With the TopCount, it usuallys orders the records by ( [Measures].[RRPayoutBasisAmount], [Dates Broker].[All Dates Broker].[2008] ), but when I change the filter to = 0 rather than <> 0 it returns records, but they are not ordered by ( [Measures].[RRPayoutBasisAmount], [Dates Broker].[All Dates Broker].[2008] ).  They seem to have their default order.  The records that are returned when I change the filter to  ([Measures].[RRPayoutBasisAmount],[Dates Broker].[All Dates Broker].[2008]) = 0 ) are not all 0 values either, it is very odd.  

I have about 30 databases that use this MDX query, and it does not work on around 10 of them, but it is fine on the others.  I have one database where there is a test copy of the data, which is an older copy of the same database where this does not work, and it works correctly.  If I take the OLAP database and point it to that test copy of the database and process it, it works correctly.  

At some point the data seems to have gotten out of whack, but I am confused as to how to figure out how.  It seems strange that it works correctly if I get the list of Descendents by doing a 1, AFTER, but if I go directly to the 2nd Level, it does not work (Descendents,2)?

Thank you for any help you can offer.
0
 
LVL 8

Expert Comment

by:srnar
ID: 21768501
kerryhill, that seems weird (20 from 30 works fine) - it may come from data. Do you have MemberNamesUnique set to True on queried dimensions?

If not - is it possible to set it (on 2005 version it does not need reprocess but not sure on 2000) and retry MDX?
0
Do You Know the 4 Main Threat Actor Types?

Do you know the main threat actor types? Most attackers fall into one of four categories, each with their own favored tactics, techniques, and procedures.

 

Author Comment

by:kerryhill
ID: 21772888
I can't because the member names are not unique.  I checked the test copy of the database, and it is set to false as well, but the MDX is successful on that db.  I agree that it is data related.  I just can't find the bad data....

I guess I am confused as to what is the difference between going directly to Level 2 of the dimension, and using "1, AFTER "?  
0
 
LVL 8

Accepted Solution

by:
srnar earned 500 total points
ID: 21792035
kerryhill, there is a difference between the two: "1, AFTER ", Level 2. Default flag in Descendant function is SELF - so it takes only members of the 2nd level (no 3 level, no LEAVES...). Equivalent to "1, AFTER " is "2, SELF_AND_AFTER". See following snippet from Adventure Works.
--176 rows (incl header) - members including leaves with Amount not empty

select [Measures].[Sales Amount] on columns,

nonempty(

	descendants(

		[Product].[Product Categories].[All Products], 1, AFTER

	)

) on rows

from [Adventure Works];
 

--ame as above

select [Measures].[Sales Amount] on columns,

nonempty(

	descendants(

		[Product].[Product Categories].[All Products], 2, SELF_AND_AFTER

	)

) on rows

from [Adventure Works];
 

--38 rows (incl header) - 37 members of the Subcategory level

select [Measures].[Sales Amount] on columns,

(

	descendants(

		[Product].[Product Categories].[All Products], 2

	)

) on rows

from [Adventure Works];
 

--same as above - SELF is default

select [Measures].[Sales Amount] on columns,

(

	descendants(

		[Product].[Product Categories].[All Products], 2, SELF

	)

) on rows

from [Adventure Works];
 

--180 rows (incl header) = like 1 AFTER + {[All Products], [Accessories], [Bikes], [Clothing]}

--note Compoents member has [Sales Amount] empty

select [Measures].[Sales Amount] on columns,

nonempty(

	descendants(

		[Product].[Product Categories].[All Products], 2, SELF_BEFORE_AFTER

	)

) on rows

from [Adventure Works];

Open in new window

0
 

Author Closing Comment

by:kerryhill
ID: 31465991
It did confirm that I was not crazy.  I used the work around, I am still not sure why it doesn't work going directly to the child branch.
0

Featured Post

IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

APEX (Application Express) is used to develop a web application from Oracle. SQL Workshop is one of the tools that comes with Oracle APEX to query or modify the database objects or to make any changes to the structure.
SQL Command Tool comes with APEX under SQL Workshop. It helps us to make changes on the database directly using a graphical user interface. This helps us writing any SQL/ PLSQL queries and execute it on the database and we can create any database ob…
Video by: Steve
Using examples as well as descriptions, step through each of the common simple join types, explaining differences in syntax, differences in expected outputs and showing how the queries run along with the actual outputs based upon a simple set of dem…
Polish reports in Access so they look terrific. Take yourself to another level. Equations, Back Color, Alternate Back Color. Write easy VBA Code. Tighten space to use less pages. Launch report from a menu, considering criteria only when it is filled…

758 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

22 Experts available now in Live!

Get 1:1 Help Now