如何编写按日期范围和维度成员值进行切片的 mdx 查询

Posted

技术标签:

【中文标题】如何编写按日期范围和维度成员值进行切片的 mdx 查询【英文标题】:How can I write an mdx query that slices by both a date range and dimension member value 【发布时间】:2013-06-26 02:50:09 【问题描述】:

我需要编写一个 mdx 查询,它通过维度的值以及日期范围来限制其结果。我知道如何做其中之一,但我不知道如何同时做。

这适用于日期范围:

SELECT [Measures].[Hours] ON COLUMNS, [Time Type].[Type].Members ON ROWS 
FROM [cube]
WHERE [Date].[Date ISO].[2013-01-26]:[Date].[Date ISO].[2013-06-25]

这适用于成员切片器:

SELECT [Measures].[Hours] ON COLUMNS, [Time Type].[Type].Members ON ROWS 
FROM [cube]
WHERE [Time Type].[Allocation Type].[Direct]

如何同时通过这两个 WHERE 子句值约束结果?我尝试将它们都放在同一个 WHERE 中,如下所示:

SELECT [Measures].[Hours] ON COLUMNS, [Time Type].[Type].Members ON ROWS 
FROM [cube]
WHERE ([Time Type].[Allocation Type].[Direct],
    [Date].[Date ISO].[2013-01-26]:[Date].[Date ISO].[2013-06-25])

但蒙德里安回答:没有函数与签名 (, ) 匹配。

请注意,蒙德里安不支持子查询,否则我会这样做。

我想我可能需要在我的行上使用过滤器函数来实现我的成员约束,但我需要过滤一些我不想显示的内容,我不知道该怎么做。

【问题讨论】:

【参考方案1】:

我认为交叉连接是这样的答案:

SELECT [Measures].[Hours] ON COLUMNS, [Time Type].[Type].Members ON ROWS 
FROM [cube]
WHERE CROSSJOIN([Time Type].[Allocation Type].[Direct],
    [Date].[Date ISO].[2013-01-26]:[Date].[Date ISO].[2013-06-25])

CROSSJOIN 将“直接”成员和我范围内的日期的所有组合创建为我的 WHERE 切片器的元组。我认为这是正确的答案。

【讨论】:

以上是关于如何编写按日期范围和维度成员值进行切片的 mdx 查询的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MDX 中对同一维度进行分组和过滤

OLAP SSAS MDX 如何获取先前选定/可见日期的度量值

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

Mondrain MDX 用于日期范围之间的记录,其中开始日期和结束日期是单独的列

SSAS MDX - 根据其他两个维度从一个维度中选择

您如何使用 MDX 计算 MTD/YTD 平均工作日销售额?