RANKING Function in DAX or MDX - reporting-services

How can i get result in attached image by DAX or MDX.Both can work for me.
( I will use DAX in Tabular Model and Will use MDX on SSRS part).
Sample Format
I tried below code but it didn't work.
WITH
SET OrderSet AS
Order
(
(
[Dim Product].[Category Name].[Category Name].MEMBERS
,[Dim Product].[Subcategory Name].[Subcategory Name].MEMBERS
,[Dim Product].[Sub Subcategory Name].[Sub Subcategory Name].MEMBERS
,[Dim Product].[Product Name].[Product Name].MEMBERS
)
,[Measures].[Order Quantity]
,BDESC
)
MEMBER [Measures].[RankOrderCount] AS
Rank
(
(
[Dim Product].[Category Name].CurrentMember
,[Dim Product].[Subcategory Name].CurrentMember
,[Dim Product].[Sub Subcategory Name].CurrentMember
,[Dim Product].[Product Name].CurrentMember
)
,OrderSet
)
SELECT
{
[Measures].[Order Quantity]
,[Measures].[RankOrderCount]
} ON 0
,NON EMPTY
{OrderSet} ON 1
FROM [Adventure Works DW2016CTP3];

I don't understand the problem. If I run this:
WITH
SET OrderSet AS
Order
(
(
[Product].[Category].[Category].MEMBERS
,[Product].[Subcategory].[Subcategory].MEMBERS
)
,[Measures].[Order Quantity]
,BDESC
)
MEMBER [Measures].[RankOrderCount] AS
Rank
(
(
[Product].[Category].CurrentMember
,[Product].[Subcategory].CurrentMember
)
,OrderSet
)
SELECT
{
[Measures].[Order Quantity]
,[Measures].[RankOrderCount]
} ON 0
,NON EMPTY
{OrderSet} ON 1
FROM [Adventure Works];
I get this:
This looks like your desired output format - but I did not change the script - so what is the question?

For example:
DEFINE
VAR TableTMP1 =
SELECTCOLUMNS (
DimProductTable,
"Product Name", DimProductTable[Product Name],
"Sub Subcategory Name", RELATED ( SubSubcategoryTable[Sub Subcategory Name] ),
"Subcategory Name", RELATED ( SubcategoryTable[Subcategory Name] ),
"Category Name", RELATED ( CategoryTable[Category Name] )
)
VAR TableTMP2 =
ADDCOLUMNS (
TableTMP1,
"Order Count", CALCULATE ( SUM ( OrderTable[Quantity] ) )
)
EVALUATE
ADDCOLUMNS ( TableTMP2, "Rank", RANKX ( TableTMP2, [Order Count], ASC ) )
ORDER BY [Rank] ASC

Related

Converting a DAX expression to an SSRS expression

I have these two expressions to convert from DAX expressions to SSRS expressions, I am trying to replicate this expression in an ssrs environment to determine the metrics as shown below. I quite understand the expression but finding the appropriate expression to articulate this expression in ssrs seems to be the issue
ABS (
CALCULATE ( [CashAmount], PATHCONTAINS ( 'Account'[Account Hierarchy], "ABC" ) )
) < 1,
BLANK (),
DIVIDE (
CALCULATE ( [CashAmount], PATHCONTAINS ( 'Account'[Account Hierarchy], "ABC" ) ),
CALCULATE ( [CashAmount], PATHCONTAINS ( 'Account'[Account Hierarchy], "XYZ" ) )
)
) * -1 ```
and ```CALCULATE (
[CashAmount],
FILTER (
ALL ( 'Account' ),
PATHCONTAINS ( 'Account'[Account Hierarchy], "ABC" )
)
)
+ CALCULATE (
[CashAmount],
FILTER (
ALL ( 'Account' ),
PATHCONTAINS ( 'Account'[Account Hierarchy], "EFG" )
)
)
+ CALCULATE (
[CashAmount],
FILTER (
ALL ( 'Account' ),
PATHCONTAINS ( 'Account'[Account Hierarchy], "HIJK" )
)
)
+ CALCULATE (
[CashAmount],
FILTER (
ALL ( 'Account' ),
PATHCONTAINS ( 'Account'[Account Hierarchy], "LMNO" )
)
) ```

MDX How to calculate measure against dimension without displaying members in results

Could someone please help me with the below MDX problem:
I got the dataset like the one below:
With
Set Range1 as {[Date].[Calendar].[Month].&[2008]&[1]
:[Date].[Calendar].[Month].&[2008]&[12]}
Set Range2 as
{[Delivery Date].[Calendar].[Month].&[2008]&[1]:
[Delivery Date].[Calendar].[Month].&[2008]&[12]}
MEMBER measures.A as [Measures].[Internet Order Count] + [Measures].[Reseller Order Count]
select {[Measures].[Internet Order Count],A} on columns,
non empty(
[Sales Territory].[Sales Territory Country].[Sales Territory Country]*
Range1
*Range2
)
having [Date].[Calendar].currentmember.member_caption
= [Delivery Date].[Calendar].currentmember.member_caption
AND A > 100
on rows
from [Adventure Works]
The problem is that results are displayed with [Sales Territory] Dimension - I would like to get the results only displaying months but with measure A also calculated against [Sales Territory].
The results for measure A should looks like:
For example: 1128 for January
The Correct results should looks like:
Thanks
Sorry - was unable to past the code:
WITH MEMBER [Measures].[A] AS
[Measures].[Internet Order Count] + [Measures].[Reseller Order Count]
SELECT
{ [Measures].[Internet Order Count], [Measures].[A] } ON COLUMNS,
[Date].[Calendar].[Month] ON ROWS
FROM (
SELECT { [Measures].[Internet Order Count] } ON COLUMNS,
Filter (
Filter ( [Date].[Calendar].[Month] * [Delivery Date].[Calendar].[Month], [Date].[Calendar].CurrentMember.Name = [Delivery Date].[Calendar].CurrentMember.Name ) * [Sales Territory].[Sales Territory Country].[Sales Territory Country],
[Measures].[Internet Order Count] + [Measures].[Reseller Order Count] > 100
) ON ROWS
FROM [Adventure Works]
)
WHERE [Date].[Calendar Year].[CY 2008]
I've ignored the ranges for now but this is as close as I can get:
WITH
MEMBER measures.c1 AS
[Date].[Calendar].CurrentMember.Member_Caption
MEMBER measures.c2 AS
[Delivery Date].[Calendar].CurrentMember.Member_Caption
MEMBER measures.x AS
IIF
(
measures.c1 = measures.c2
,
[Measures].[Internet Order Count] + [Measures].[Reseller Order Count]
,null
)
SET q AS
Filter
(
[Sales Territory].[Sales Territory Country].[Sales Territory Country]*
[Date].[Calendar].[Month].MEMBERS*
[Delivery Date].[Calendar].[Month].MEMBERS
,
measures.x > 100
)
SELECT
{measures.x} ON 0
,NON EMPTY
Extract
(
q
,[Date].[Calendar]
,[Delivery Date].[Calendar]
) ON 1
FROM [Adventure Works];
EDIT
The following gives two options for the Rows - option A and option B:
WITH
MEMBER measures.c1 AS
[Date].[Calendar].CurrentMember.Member_Caption
MEMBER measures.c2 AS
[Delivery Date].[Calendar].CurrentMember.Member_Caption
MEMBER measures.x AS
IIF
(
measures.c1 = measures.c2
,
[Measures].[Internet Order Count] + [Measures].[Reseller Order Count]
,null
)
SET q AS
Filter
(
[Sales Territory].[Sales Territory Country].[Sales Territory Country]*
[Date].[Calendar].[Month].&[2008]&[1]*
[Delivery Date].[Calendar].[Month].MEMBERS
,
measures.x > 100
)
SELECT
{measures.x} ON 0
//<<<<<Option A.try just this and sum the cells ....1128
,q
//<<<<<Option B.try just this and sum the cells ....1221
//,Extract
// (
// q
// ,[Date].[Calendar]
// ,[Delivery Date].[Calendar]
// )
ON 1
FROM [Adventure Works];
EDIT 2
This gives the correct answer - be mean of me not to reference the real author: https://social.msdn.microsoft.com/Forums/en-US/be750f75-0e39-41b8-9578-9dceb58a5865/strange-context-aware-behaviour-of-adventure-works-script?forum=sqlanalysisservices
WITH
MEMBER measures.c1 AS
[Date].[Calendar].CurrentMember.Member_Caption
MEMBER measures.c2 AS
[Delivery Date].[Calendar].CurrentMember.Member_Caption
MEMBER measures.[Calendar Month] AS
measures.c1
MEMBER measures.[Delivery Month] AS
measures.c2
MEMBER measures.x AS
IIF
(
measures.c1 = measures.c2
,
[Measures].[Internet Order Count] + [Measures].[Reseller Order Count]
,NULL
)
SELECT
{
measures.[Calendar Month]
,measures.[Delivery Month]
,measures.x
} ON COLUMNS
FROM [Adventure Works]
WHERE
{
NonEmpty
(
[Sales Territory].[Sales Territory].[Country].MEMBERS*
[Date].[Calendar].[Month].&[2008]&[1]*
[Delivery Date].[Calendar].[Month].MEMBERS
,measures.x
)
}
-
{
Filter
(
NonEmpty
(
[Sales Territory].[Sales Territory].[Country].MEMBERS*
[Date].[Calendar].[Month].&[2008]&[1]*
[Delivery Date].[Calendar].[Month].MEMBERS
,measures.x
)
,
measures.x < 100
)
};
You can filter with sales territory, by doing the following instead of your current from [Adventure Works]
from (
select {[Sales Territory].[Sales Territory Country].[Sales Territory Country]} on columns
from [Adventure Works]
)
Having said that, you can then remove the sales territory from here.. and just have Range1 * Range2
non empty(
[Sales Territory].[Sales Territory Country].[Sales Territory Country]
Range1
*Range2
)
You can then continue to filter, using the MDX Filter function
from (
select {[Sales Territory].[Sales Territory Country].[Sales Territory Country]} on columns
from
(
select {
FILTER (
[Date].[Calendar].MEMBERS
,[Date].[Calendar].currentmember.member_caption = [Delivery Date].[Calendar].currentmember.member_caption and A > 100
)
} on columns
[Adventure Works]
)
)
If you don't want to see [Sales Territory].[Sales Territory Country].[Sales Territory Country] in the final SELECT, you can use EXISTS clause in MDX
With
Set Range1 as {[Date].[Calendar].[Month].&[2008]&[1]
:[Date].[Calendar].[Month].&[2008]&[12]}
Set Range2 as
{[Delivery Date].[Calendar].[Month].&[2008]&[1]:
[Delivery Date].[Calendar].[Month].&[2008]&[12]}
MEMBER measures.A as [Measures].[Internet Order Count] + [Measures].[Reseller Order Count]
select {[Measures].[Internet Order Count],A} on columns,
non empty filter((
exists({Range1
*Range2}, [Sales Territory].[Sales Territory Country].[Sales Territory Country]
)), measures.A > 100)
having [Date].[Calendar].currentmember.member_caption
= [Delivery Date].[Calendar].currentmember.member_caption

How to Order amount by multiple dimensions in MDX?

In my Cube,I have following Measures,Dimensions.
**Measure:**
Amount
**From Customer dimension:**
Busines Unit Number
Business Unit Description
Cust Number
Cust Name
**From Bucket dimension:**
Bucket
I want Amount to be ordered by all these dimensions/attributes.
What I tried in MDX so far is,
SELECT
NON EMPTY {
[Measures].[Amount]
} ON COLUMNS,
NON EMPTY { (
ORDER(
(
[Dim Customer].[BU].[BU].MEMBERS*
[Dim Customer].[BU Description].[BU Description].MEMBERS*
[Dim Customer].[Cust No].[Cust No].ALLMEMBERS*
[Dim Address].[Customer Name].[Customer Name].ALLMEMBERS
),
[Measures].[Amount],
BDESC
)
*
[Bucket Dim].[Bucket].[Bucket].ALLMEMBERS
) } ON ROWS
FROM [Cube]
Still I am not getting proper order as I want & also it is taking a too much time to execute.
You can nest ORDER functions to get multiple order by criteria.
The outer order is applied first - a little counter-intuitive.
The following will be ordered by the value of cust no, then by the caption of BU then by [Measures].[Amount]
SELECT
NON EMPTY
{[Measures].[Amount]} ON COLUMNS
,NON EMPTY
{
Order
(
Order
(
Order
(
[Dim Customer].[BU].[BU].MEMBERS*
[Dim Customer].[BU Description].[BU Description].MEMBERS*
[Dim Customer].[Cust No].[Cust No].ALLMEMBERS*
[Dim Address].[Customer Name].[Customer Name].ALLMEMBERS
,[Measures].[Amount]
,BDESC
)
,[Dim Customer].[BU].CurrentMember.Member_Caption
,BDESC
)
,[Dim Customer].[Cust No].CurrentMember.MemberValue
,BDESC
)
*
[Bucket Dim].[Bucket].[Bucket].ALLMEMBERS
} ON ROWS
FROM [Cube];

Error adding new column

I'm trying to add an "account subcategory" column to my report using the query builder.
I added the column and got the error message:
"An MDX expression was expected. An empty expression was specified."
How do I format the MDX in order to get the result I am looking for?
I posted the code below. Hope this helps.
SELECT NON EMPTY { [Measures].[Order Partic Adj], [Measures].[PY Net Cash], [Measures].[Order Merch Adj], [Measures].[OCCURS - APY BOOKING FACT], [Measures].[PY Orders], [Measures].[Net Cash Merch Adj], [Measures].[Net Cash Acq Adj], [Measures].[Total Proj Orders], [Measures].[Order Acq Adj], [Measures].[Net Cash Partic Adj], [Measures].[Total Proj Net Cash] } ON COLUMNS, NON EMPTY { ([Current Assignment].[Territory Code].[Territory Code].
ALLMEMBERS * [Current Assignment].[Sales Rep Name Caps].[Sales Rep Name Caps].
ALLMEMBERS * [Current Assignment].[Sales Rep Employee Code].[Sales Rep Employee Code].
ALLMEMBERS * [Account].[Account Subcategory Name].[Account Subcategory Name].
ALLMEMBERS * [Account].[ACCOUNT NAME].[ACCOUNT NAME].
ALLMEMBERS * [Account].[LIFETOUCH ID].[LIFETOUCH ID].
ALLMEMBERS * [Account].[NACAM Ordered].[NACAM Ordered].
ALLMEMBERS * [Account].[ENROLLMENT COUNT].[ENROLLMENT COUNT].
ALLMEMBERS * [Account].[STATE].[STATE].
ALLMEMBERS * [Account].[District Name].[District Name].
ALLMEMBERS * [Account].[City].[City].
ALLMEMBERS * [Account].[COUNTY].[COUNTY].
ALLMEMBERS * [APY].[BOOKING STATUS].[BOOKING STATUS].
ALLMEMBERS * [APY].[X BOOKING STATUS ID].[X BOOKING STATUS ID].
ALLMEMBERS * [APY].[AT RISK IND].[AT RISK IND].
ALLMEMBERS * [APY].[INCENTIVE ACQUISITION IND].[INCENTIVE ACQUISITION IND].
ALLMEMBERS * [APY].[CY BOOKING CAMERA TYPE NAME].[CY BOOKING CAMERA TYPE NAME].
ALLMEMBERS * [APY].[CURRENT YEAR SELLING METHODS].[CURRENT YEAR SELLING METHODS].
ALLMEMBERS * [APY].[PY ACTUAL CAMERA TYPE NAME].[PY ACTUAL CAMERA TYPE NAME].
ALLMEMBERS * [APY].[ACQUIRED BUSINESS NAME].[ACQUIRED BUSINESS NAME].
ALLMEMBERS * [APY].[PRIOR YEAR SELLING METHODS].[PRIOR YEAR SELLING METHODS].
ALLMEMBERS * [Marketing].[SUB PROGRAM NAME].[SUB PROGRAM NAME].
ALLMEMBERS * [Current Assignment].[AMS Business Unit Name].[AMS Business Unit Name].
ALLMEMBERS * [Account].[POSTAL CODE].[POSTAL CODE].
ALLMEMBERS ) } DIMENSION PROPERTIES MEMBER_CAPTION, MEMBER_UNIQUE_NAME ON ROWS FROM ( SELECT ( STRTOSET(#APYBOOKINGSTATUS, CONSTRAINED) ) ON COLUMNS FROM ( SELECT ( STRTOSET(#CurrentAssignmentSalesRepNameCaps, CONSTRAINED) ) ON COLUMNS FROM ( SELECT ( STRTOSET(#CurrentAssignmentTerritoryCode, CONSTRAINED) ) ON COLUMNS FROM ( SELECT ( STRTOSET(#CurrentAssignmentRegionName, CONSTRAINED) ) ON COLUMNS FROM ( SELECT ( STRTOSET(#CurrentAssignmentAreaName, CONSTRAINED) ) ON COLUMNS FROM ( SELECT ( STRTOSET(#CurrentAssignmentAMSBusinessUnitName, CONSTRAINED) ) ON COLUMNS FROM ( SELECT ( STRTOSET(#CurrentAssignmentCountryName, CONSTRAINED) ) ON COLUMNS FROM ( SELECT ( STRTOSET(#SchoolYearSCHOOLYEAR, CONSTRAINED) ) ON COLUMNS FROM ( SELECT ( STRTOSET(#MarketingSUBPROGRAMNAME, CONSTRAINED) ) ON COLUMNS FROM [BO_APY_Booking_Fact_Full]))))))))) WHERE ( IIF( STRTOSET(#SchoolYearSCHOOLYEAR, CONSTRAINED).Count = 1, STRTOSET(#SchoolYearSCHOOLYEAR, CONSTRAINED), [School Year].[SCHOOL YEAR].currentmember ), IIF( STRTOSET(#CurrentAssignmentCountryName, CONSTRAINED).Count = 1, STRTOSET(#CurrentAssignmentCountryName, CONSTRAINED), [Current Assignment].[Country Name].currentmember ), IIF( STRTOSET(#CurrentAssignmentAreaName, CONSTRAINED).Count = 1, STRTOSET(#CurrentAssignmentAreaName, CONSTRAINED), [Current Assignment].[Area Name].currentmember ), IIF( STRTOSET(#CurrentAssignmentRegionName, CONSTRAINED).Count = 1, STRTOSET(#CurrentAssignmentRegionName, CONSTRAINED), [Current Assignment].[Region Name].currentmember ) ) CELL PROPERTIES VALUE, BACK_COLOR, FORE_COLOR, FORMATTED_VALUE, FORMAT_STRING, FONT_NAME, FONT_SIZE, FONT_FLAGS

Troubling MDX Query

I have an MDX query I have been struggling with for a while and just can't seem to get it to fly right!! THe pain point is the subquery that is trying to pull in only those jobs that have a status of anythign BUT "Closed" (DIM PROJECT].[Job Status].&[Closed]}. I know/think I'm maybe missing a parentheses somewhere possibly???
MAybe a second set of eyes would help???
SELECT
NON EMPTY
{
[Measures].[Estimate Extended Amount]
,[Measures].[Estimate Line Total]
,[Measures].[Estimate Markup Amount]
} ON COLUMNS
,NON EMPTY
{
[DIM PROJECT].[Client - Division - Product - Component].[Job Component Number].ALLMEMBERS*
[DIM PROJECT].[Component Description].[Component Description].ALLMEMBERS*
[DIM PROJECT].[Client PO Number].[Client PO Number].ALLMEMBERS*
[DIM PROJECT].[Job Status].[Job Status].ALLMEMBERS*
[DIM PROJECT].[Project Start Date].[Project Start Date].ALLMEMBERS*
[DIM PROJECT].[Project End Date].[Project End Date].ALLMEMBERS*
[DIM FUNCTION].[Function Category].[Function Category].ALLMEMBERS*
[DIM ESTIMATE].[Estimate Number].[Estimate Number].ALLMEMBERS*
[DIM ESTIMATE].[Estimate Status].[Estimate Status].ALLMEMBERS
}
DIMENSION PROPERTIES
MEMBER_CAPTION
,MEMBER_UNIQUE_NAME
ON ROWS
FROM
(
SELECT
{[DIM ESTIMATE].[Estimate Status].&[Approved]} ON COLUMNS
FROM (-{[DIM PROJECT].[Job Status].&[Closed]} ON COLUMNS
(
SELECT
StrToSet
(#DIMPROJECTProduct
,CONSTRAINED
) ON COLUMNS
FROM
(
SELECT
StrToSet
(#DIMPROJECTDivision
,CONSTRAINED
) ON COLUMNS
FROM
(
SELECT
StrToSet
(#DIMPROJECTClient
,CONSTRAINED
) ON COLUMNS
FROM [ESTIMATES]
)
)
)
)
WHERE
(
IIF
(
StrToSet
(#DIMPROJECTClient
,CONSTRAINED
).Count
= 1
,StrToSet
(#DIMPROJECTClient
,CONSTRAINED
)
,[DIM PROJECT].[Client].CurrentMember
)
,IIF
(
StrToSet
(#DIMPROJECTDivision
,CONSTRAINED
).Count
= 1
,StrToSet
(#DIMPROJECTDivision
,CONSTRAINED
)
,[DIM PROJECT].[Division].CurrentMember
)
,IIF
(
StrToSet
(#DIMPROJECTProduct
,CONSTRAINED
).Count
= 1
,StrToSet
(#DIMPROJECTProduct
,CONSTRAINED
)
,[DIM PROJECT].[Product].CurrentMember
)
)
CELL PROPERTIES
VALUE
,BACK_COLOR
,FORE_COLOR
,FORMATTED_VALUE
,FORMAT_STRING
,FONT_NAME
,FONT_SIZE
,FONT_FLAGS;
I am not quite sure what you are trying to do, but it seems like you might be over complicating your query a little bit. I think the function you are looking for is EXCEPT:
Except([DIM PROJECT].[Job Status].[All].Children,[DIM PROJECT].[Job Status].&[Closed])
This will give you all job statuses except closed. If you put it in your where clause (ymmv with my simplification) it might read:
SELECT
NON EMPTY
{
[Measures].[Estimate Extended Amount]
,[Measures].[Estimate Line Total]
,[Measures].[Estimate Markup Amount]
} ON COLUMNS
,NON EMPTY
{
[DIM PROJECT].[Client - Division - Product - Component].[Job Component Number].ALLMEMBERS*
[DIM PROJECT].[Component Description].[Component Description].ALLMEMBERS*
[DIM PROJECT].[Client PO Number].[Client PO Number].ALLMEMBERS*
[DIM PROJECT].[Job Status].[Job Status].ALLMEMBERS*
[DIM PROJECT].[Project Start Date].[Project Start Date].ALLMEMBERS*
[DIM PROJECT].[Project End Date].[Project End Date].ALLMEMBERS*
[DIM FUNCTION].[Function Category].[Function Category].ALLMEMBERS*
[DIM ESTIMATE].[Estimate Number].[Estimate Number].ALLMEMBERS*
[DIM ESTIMATE].[Estimate Status].&[Approved]
}
DIMENSION PROPERTIES
MEMBER_CAPTION
,MEMBER_UNIQUE_NAME
ON ROWS
FROM [ESTIMATES]
WHERE
( StrToSet(#DIMPROJECTProduct),
StrToSet(#DIMPROJECTDivision),
StrToSet(#DIMPROJECTClient),
Except([DIM PROJECT].[Job Status].[All].Children,[DIM PROJECT].[Job Status].&[Closed]))
If your parameters happen to be single members you can probably just use StrToMember in the where clause.