Assuming that [class] only has a single value for a given member of
[Rollno], then the approach discussed in this earlier thread may help:
http://groups-beta.google.com/group/...rver.olap/brow
se_thread/thread/1a5b25fbc03ad959/766057652d6c6ebb#766057652d6c6ebb
SET CUST_LIST1 AS 'Order( Head([Customers].[Name].Members, 20),
[Customers].CurrentMember.Properties ("Member Card"), BASC)'
MEMBER [Measures].Card as
'[Customers].CurrentMember.properties("Member Card")'
MEMBER [Measures].PreviousInList as 'Rank( [Customers].CurrentMember,
CUST_LIST1)-2'
MEMBER [Measures].PreviousInList_Card as 'iif(PreviousInList < 0,
"None",
SubSet( CUST_LIST1,PreviousInList, 1).Item(0).properties("Member
Card"))'
MEMBER [Measures].YesOrNo as 'iif(PreviousInList < 0, 1,
iif(CStr([Measures].Card) <> Cstr([Measures].PreviousInList_Card), 1,
0))'
SET CUST_LIST2 as 'filter(CUST_LIST1, ([Customers].CurrentMember,
[Measures].YesOrNo) = 1)'
SELECT
{[Unit Sales], Card, PreviousInList, PreviousInList_Card,
YesOrNo } ON COLUMNS,
{ CUST_LIST2 } ON ROWS
FROM Sales
...
A modified version of this query for your scenario is:
SET ROLL_LIST AS
'Order(Order([Rollno].[Rollno].Members,
[Measures].[marks], BDESC),
[Measures].[class], BASC)'
MEMBER [Measures].PreviousInList as 'Rank( [Rollno].CurrentMember,
ROLL_LIST)-2'
MEMBER [Measures].PreviousInList_Class as
'iif(PreviousInList < 0,
"None",
(SubSet(ROLL_LIST, PreviousInList, 1).Item(0),
[Measures].[class]))'
MEMBER [Measures].YesOrNo as
'iif(PreviousInList < 0, 1,
iif(CStr([Measures].[class])
<> Cstr([Measures].PreviousInList_Class),
1, 0))'
SET [Toppers] as
'filter(ROLL_LIST, ([Rollno].CurrentMember,
[Measures].YesOrNo) = 1)'
SELECT
{[Measures].[class], [Measures].[marks]} ON COLUMNS,
TopCount([Toppers], 3, [Measures].[marks]) ON ROWS
FROM MarksCube
- Deepak
Deepak Puri
Microsoft MVP - SQL Server
*** Sent via Developersdex http://www.developersdex.com ***