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

5

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

我正在使用SSAS 2005MS SQL Server 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)中的Cube Browser验证我的立方体数据的完整性。
我还查看了SQL Server Profiler以获取由Cube Browser生成的查询,但是这些查询无法从Management Studio中执行,那里运行我的MDX查询进行测试。
对于我使用的语法有什么问题,您有任何想法吗?

你确定你实际上得到了这些客户所属的整个市场的总数吗?还是它只是在显示这两个客户的总数旁边的市场名称?如果你将 {[Customers].[Markets].Members} 更改为 {[Customers].[Customers].children},你会得到什么结果? - mmarie
我非常确定。如果我将Members属性替换为Children(对于市场),那么我仍然会得到一个聚合。我成功地解决了我的问题,请参见下文。谢谢回复! - Yuval Herziger
顺便说一下,我很确定这是正确的,因为我进行了两个交叉验证实践 - (1) 在BI Dev. Studio中使用立方体浏览器,以及(2)从原始数据源,即SQL数据库中查询数据。但那实际上是我误解了MDX WHERE子句的概念,而不是其他什么问题 :) 请参见下面提供的解决方案。 - Yuval Herziger
1个回答

9

好的,感谢在另一个网络组中回答问题的有用的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查询中的可度量值要按其原始名称进行引用,而格式化与外部查询有关的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接