2013-10-08 97 views
2

我试图创建一个SSRS报表数据集作为记录在这里:MDX正常化设置的措施

http://sqlblog.com/blogs/stacia_misner/archive/2010/10/08/29249.aspx

所面临的挑战是,我有多种措施,谁的数据我想在措施包括:列,我想在RowValue列中包含度量的名称。那么,下面的查询的措施“销售金额”仅返回数据:

with 
member [Measures].[Measure] as [Measures].[Sales Amount] 
member [Measures].[RowValue] as [Product].[Category].CurrentMember.Name 
member [Measures].[ColumnValue] as [Date].[Calendar Year].CurrentMember.Name 
select {[Measures].[Measure], [Measures].[RowValue], [Measures].[ColumnValue]} on columns, 
non empty ([Product].[Category].[Category].Members, [Date].[Calendar Year].[Calendar Year].Members) on rows 
from [Adventure Works] 

我想要做的就是运行以下类型的查询,但在查询的结构返回上述数据,这将允许我将其插入到SSRS报告矩阵中:

WITH 
     MEMBER measures.SalesAmount AS [Measures].[Sales Amount] 
     MEMBER measures.CustomerCount AS [Measures].[Customer Count] 
     MEMBER measures.InternetFreightCost AS [Measures].[Internet Freight Cost] 
SELECT [Date].[Calendar Year].[Calendar Year].Members ON COLUMNS, 
    {measures.SalesAmount,measures.CustomerCount,measures.InternetFreightCost} ON ROWS 
FROM [Adventure Works] 

做任何MDX忍者都知道这是否甚至可以用MDX?

+0

对于您引用的文章中描述的查询结构,您需要哪些灵活性?您是否有其他需要提供同一报告的查询,这些报告只有一个度量和行中的任意层次结构,而列中的另一个层次?或者,你所有的报告在列中都有一个层次结构(比如你的样本中的年份)和行中的一个或多个度量值? – FrankPl

+0

你好弗兰克,我只有一个层次(总是日期)。但我确实有多项措施需要包括在内。 –

回答

0
with member [Geography].[City].[Sales Amount] as 1 
    member [Geography].[City].[Customer Count] as 1 
    member [Geography].[City].[Freight Cost] as 1 
    member [Measures].[RowValue] as [Geography].[City].CurrentMember.Name 
    member [Measures].[ColumnValue] as [Date].[Calendar Year].CurrentMember.Name 
    member [Measures].[Measure] as 
      CASE 
       WHEN [Geography].[City].CurrentMember IS [Geography].[City].[Sales Amount] 
        THEN ([Measures].[Internet Sales Amount], [Geography].[City].[All Geographies]) 
       WHEN [Geography].[City].CurrentMember IS [Geography].[City].[Customer Count] 
        THEN ([Measures].[Customer Count], [Geography].[City].[All Geographies]) 
       WHEN [Geography].[City].CurrentMember IS [Geography].[City].[Freight Cost] 
        THEN ([Measures].[Internet Freight Cost], [Geography].[City].[All Geographies]) 
      END 

select {[Measures].[RowValue], [Measures].[ColumnValue], [Measures].[Measure]} 
     on columns, 
     { [Geography].[City].[Sales Amount], [Geography].[City].[Customer Count], [Geography].[City].[Freight Cost]} 
     * 
     [Date].[Calendar Year].[Calendar Year].Members 
     having [Measures].[Measure] <> null 
     on rows 
from [Adventure Works] 

应该提供你想要的。我使用[Geography].[City]作为实用程序层次结构。这可以是查询中未使用的任何层次结构。我选择了这一个,因为它与查询中使用的两个度量组都无关,因此不太可能用于任何查询。一些Cube设计师在其立方体中创建一个或两个与任何度量值组无关的单成员虚拟维度,并且可以像这里一样使用它来创建计算成员。

ReportingServices查询的一个难点是度量值必须始终位于列中,而列中不能有其他层次结构。因此,如果我们想在行中使用这些度量,我们必须将它们移动到另一个层次结构中。分两步完成:首先,我们在实用程序层次结构上创建虚拟成员,然后将这些虚拟成员映射到[Measures].[Measure]定义的CASE构造中所需的度量,我们需要使用实用程序维度的默认成员(大多数例如All成员),以获得与我用于虚拟值的值不同的值。

最后:non empty无法正确使用此构造,因为[Measures].[RowValue][Measures].[ColumnValue]从不为空。因此我将它替换为HAVING,它可以查看行内的特定列值。