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

◇◆丶佛笑我妖孽 提交于 2019-12-11 11:14:18

问题


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:


回答1:


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]



回答2:


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
      )
    };



回答3:


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]
        )
)



回答4:


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


来源:https://stackoverflow.com/questions/26588874/mdx-how-to-calculate-measure-against-dimension-without-displaying-members-in-res

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!