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 子句语法 - 从同一层次结构中过滤多个值的主要内容,如果未能解决你的问题,请参考以下文章