Yuv*_*ger 4 sql-server olap ssas mdx where-clause
我对数据仓库和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]})
Run Code Online (Sandbox Code Playgroud)
我得到的结果是这些客户所属的整个市场的可衡量因素的汇总.
问题是如果我只在WHERE子句中使用[Customers]维度的成员,并且只有当我不用{}括号包装它时,我得到我想要的结果 - 为客户聚合数据[1012]只是,因为它应该(用我的原始数据源验证).
以下是同一查询中WHERE子句的示例,它为一个客户过滤提供了正确的结果:
WHERE ({[Order Type].[Order Type].&[1],
[Order Type].[Order Type].&[5],
[Order Type].[Order Type].&[6]},
[Customers].[Customers].&[1012])
Run Code Online (Sandbox Code Playgroud)
在使用此WHERE子句的查询中,我得到了正确的结果,但仅适用于一个成员.
我通过BI Development Studio(v.2005)中的多维数据集浏览器不断验证我的多维数据集中数据的完整性.
我还查看了SQL Server Profiler以获取多维数据集浏览器生成的查询,但这些查询在Management Studio中是不可读且不可执行的,其中运行我的MDX查询以进行测试.
我对使用的语法有什么问题吗?
好的,感谢有帮助的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]}))
Run Code Online (Sandbox Code Playgroud)
同样,对于在MDX中深入研究WHERE子句概念的人来说,这在很多方面与SQL WHERE子句在概念上是不同的.
请注意我在外部查询中声明的成员,为了数字格式,在内部查询的范围内无法识别.这就是为什么内部MDX查询中的可测量值由其原始名称引用,并且格式设置与外部查询相关.