SSAS MDX WHERE子句语法 - 从同一层次结构中过滤多个值

时间:2014-01-03 08:27:51

标签: sql-server ssas mdx where-clause olap

我对数据仓库和MDX查询都很陌生,我意识到在下面的情况下我可能没有正确使用MDX语法。

我在 MS SQL Server 2005 上使用 SSAS 2005 ,并希望查询我的多维数据集并使用同一层次结构中的多个成员过滤结果(已过滤的成员给定特定年份([2013])和行的市场细分是“兄弟”。

WITH
    MEMBER [Measures].[Value] AS Format([Measures].[Expected Sale Price EUR], '#,###')
    MEMBER [Measures].[Pieces] AS Format([Measures].[Line Quantity], '#,###')
SELECT
    CrossJoin(     
    {[Time].[Calendar Year].&[2013]},
    {[Measures].[Value],[Measures].[Measures].[Pieces]}) 
        ON COLUMNS,

    {[Customers].[Markets].Members} 
        DIMENSION PROPERTIES MEMBER_NAME ON ROWS
FROM [Po System] 
WHERE ({[Order Type].[Order Type].&[1], 
        [Order Type].[Order Type].&[5], 
        [Order Type].[Order Type].&[6]},
       {[Customers].[Customers].&[1012],
        [Customers].[Customers].&[1922]})

我得到的结果是这些客户所属的整个市场的可衡量数据的汇总。

问题是如果我只在WHERE子句中使用[Customers]维度的成员,并且只有当我没有用 {} 括号包裹它时,我得到我想要的结果 - 仅为客户[1012]汇总数据,因为它应该是(使用我的原始数据源验证)。

以下是同一查询中WHERE子句的示例,它为一个客户过滤提供了正确的结果:

WHERE ({[Order Type].[Order Type].&[1], 
        [Order Type].[Order Type].&[5], 
        [Order Type].[Order Type].&[6]},
       [Customers].[Customers].&[1012])

在使用此WHERE子句的查询中,我得到了正确的结果,但仅适用于一个成员。

我通过BI Development Studio(v.2005)中的多维数据集浏览器不断验证我的多维数据集中数据的完整性。

我还研究了SQL Server Profiler以获取多维数据集浏览器生成的查询,但这些查询在Management Studio中是不可读且不可执行的,在那里运行我的MDX查询以进行测试。

知道我使用的语法有什么问题?

1 个答案:

答案 0 :(得分:8)

好的,感谢有帮助的BI顾问在另一个网络上的小组中回答了问题,我理解MDX查询的正确思路。

在查询的多维数据集空间中,MDX中的WHERE子句可被视为附加轴。此轴通常称为切片轴,其中一个位置由分配给WHERE子句的元组占用。此位置的成员或成员组合会影响查询的多维数据集空间中的每个元组。

在这种情况下实现过滤器的一种有用做法是使用内部查询。

以下查询完美地提供了所需的结果。

WITH 
    MEMBER [Measures].[Value] AS Format([Measures].[Expected Sale Price EUR], '#,###') 
    MEMBER [Measures].[Pieces] AS Format([Measures].[Line Quantity], '#,###') 
SELECT CrossJoin( 
    {[Time].[Calendar Year].&[2013]}, 
    {[Measures].[Value],[Measures].[Measures].[Pieces]}) 
    ON COLUMNS, 
    {[Tbl Customers].[Market Name].Members } 
    DIMENSION PROPERTIES MEMBER_NAME ON ROWS 
FROM
    ({[Measures].[Expected Sale Price EUR],[Measures].[Line Quantity]})on COLUMNS, 
    ({[Customers].[Customers].&[1012],,[Customers].[Customers].&[1922]}) on ROWS 
    FROM [Po System] 
    WHERE ({[Order Type].[Order Type].&[1], 
        [Order Type].[Order Type].&[5], 
        [Order Type].[Order Type].&[6]}))

再一次,提供了对MDX中WHERE子句概念进行深入研究的人的信用,这在概念上与SQL WHERE子句在许多方面有所区别。

请注意我在外部查询中声明的成员,为了数字格式,在内部查询的范围内无法识别。这就是为什么内部MDX查询中的可测量值由其原始名称引用,并且格式与外部查询相关。