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

Posted

技术标签:

【中文标题】SSAS MDX WHERE 子句语法 - 从同一层次结构中过滤多个值【英文标题】:SSAS MDX WHERE clause syntax - filtering multiple values from the same hierarchy 【发布时间】:2014-01-03 08:27:51 【问题描述】:

我对数据仓库和 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 以获取由 Cube Browser 生成的查询,但这些查询在 Management Studio 中是不可读且不可执行的,在 Management Studio 中运行我的 MDX 查询以进行测试。

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

【问题讨论】:

您确定您实际上获得了这些客户所属的整个市场的总数吗?还是在这两个客户总数旁边显示市场名称?如果将 [Customers].[Markets].Members 更改为 [Customers].[Customers].children,您会得到什么? 我很确定。如果我将 Members 属性替换为 Children(对于市场),那么我仍然会得到一个聚合。我确实设法从我的问题中得到答案,请参见下文。感谢您的回复! 顺便说一句,我很确定,因为我有两个交叉验证实践 - (1) 在 BI Dev 中使用多维数据集浏览器。 Studio,以及 (2) 从原始数据源(SQL 数据库)中查询数据。但这实际上是我误解 MDX WHERE 子句的概念而不是其他任何东西的问题:) 请参阅下面提供的解决方案。 【参考方案1】:

好的,感谢一位乐于助人的 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 查询中的可测量项由其原始名称引用,并且格式与外部查询相关。

【讨论】:

以上是关于SSAS MDX WHERE 子句语法 - 从同一层次结构中过滤多个值的主要内容,如果未能解决你的问题,请参考以下文章

用 MDX 查询的日期范围子句中的现有成员替换不存在的成员

MDX跨cube查询——lookupcube

SSAS 计算成员中的 MDX 查询

WHERE 子句中的 MDX 除外函数

where 子句中的 MDX '不等于'

MDX SSAS OLAP -- 根据维度选择切换属性