在MDX

时间:2017-09-27 10:13:05

标签: mdx adventureworks

需要在MDX中生成特定输出,我正在努力产生所需的结果。我正在尝试使用ADW Cube构建一个示例。

我需要制作一个表格,其中有三列:

  1. 某个类别(此示例中的城市,但此列将显示 最终根据SSRS中的选定参数进行动态更改,
  2. 针对特定月份的类别(此示例中的互联网销售额)的某种衡量标准
  3. 与第二栏相同但上个月的措施
  4. 根据第二列中的度量,表格应仅过滤到前三个最高项目。

    下面是我到目前为止所获得的一些简单的静态示例,但其基本原理是:用户在参数中选择一些值,这些值将对要过滤的表的数据进行子集化(由[Country](Canada)表示在示例中)。然后,他将在某个层次结构中选择他想要其结果的粒度级别(在示例中由[City]表示)。他会选择所需的期间(具体[年]和[月])。运行查询后, 他应该得到一个类似的表格,如下所示(根据第二栏他有三个结果):

    Category      Internet Sales Amount (CurrentPeriod) Internet Sales Amount (PreviousPeriod)
    Langford      $13,468.39                             null
    Vancouver     $12,291.48                             $7,447.26
    Sooke         $11,563.01                             null
    

    第一列表示所选的粒度。第二列表示给定项目的选定年 - 月组合的互联网销售,第三列表示所选组合之前一个月的互联网销售。

    这是我到目前为止所得到的。我能够生成表格的前两列,但我也在努力包括第三列。我来自SQL并且对MDX很新,所以如果我问的问题看起来很简单,或者我到目前为止的方法与它应该如何完成有关,那么请耐心等待。

    SELECT [Measures].[Internet Sales Amount] ON 0,  
    TopCount  
       ({[Customer].[City].[City].Members}  
       , 3  
       , [Measures].[Internet Sales Amount]
       ) ON 1  
    FROM [Adventure Works]  
    WHERE ( [Customer].[Country].&[Canada], 
            [Date].[Calendar Year].&[2007], 
            [Date].[Month of Year].&[12] )
    

1 个答案:

答案 0 :(得分:0)

好的,我设法解决了这个简化的例子。

WITH 
  MEMBER [Measures].[SalesPrevMth] AS 
    (
      [Measures].[Internet Sales Amount]
     ,[Date].[Calendar].CurrentMember.PrevMember
    ) 
SELECT 
  NON EMPTY 
    {
      [Measures].[Internet Sales Amount]
     ,[Measures].[SalesPrevMth]
    } ON COLUMNS
 ,NON EMPTY 
    TopCount  
     ({
        [Customer].[City].[City].Members
      * 
        [Date].[Calendar].[Month].ALLMEMBERS
      }, 3, [Measures].[Internet Sales Amount]) ON ROWS
FROM 
(
  SELECT 
    [Date].[Calendar].[Month].&[2007]&[12] ON COLUMNS
  FROM [Adventure Works]
)
WHERE [Customer].[Country].&[Canada];