我正在尝试制作MDX查询来回答表单问题:
显示2008年的所有记录,除了11月份的记录,除非它们发生在11月17日。
查询必须推广到使用超过三个子句,并且不应该是特定于日期的。 (我要求使用日期作为一个例子,因为它很容易理解 - 我有兴趣将我的MDX概括为不同的层次结构。
这是我到目前为止最接近的:
SELECT
NON EMPTY { [Measures].[Session Count] } ON COLUMNS,
NON EMPTY { ([SessionIDs].[Session ID].Children) } ON ROWS
FROM (
SELECT
Union(
Descendants([Start Date].[Date].Year.[2008], , LEAVES),
Descendants([Start Date].[Date].[Date].&[20081117], , LEAVES)
)
-
Descendants([Start Date].[Date].[Month].&[2008]&[11], , LEAVES)
ON COLUMNS
FROM [ADM]
) ;
问题在于排除次要包含(2008年11月17日)。我尝试在第一个联合中保留重复项,但是Exclude(减去运算符)会删除匹配的所有成员副本。
编辑:
这是另一个例子,当我要求“可推广的”解决方案时,有助于理解我的意思。
考虑一个地图应用程序,用户可以选择查看他们选择的地理区域中的数据。他们通过放大和缩小地图以及选择/取消选择quadkeys来选择这些区域。 Quadkeys整齐地映射到层次结构,通常介于18到23级之间。
有效的用例将是:
在单词中(以及完全构造映射到这些quadkeys的地名),这将是这样的:向我显示北美的所有数据,但不显示美国的数据,除非该数据是针对纽约州的,但不是在奥尔巴尼或格伦斯瀑布。
因此,上面用于日期的相同查询结构必须适用于映射或任何其他层次集。值得注意的是,我正在动态构建此MDX以响应用户操作。
答案 0 :(得分:3)
在subselect中,您只需将其放在列上:
{Except([Start Date].[Date].Month.Members, {[Start Date].[Date].[Month].&[2008]&[11]}), [Start Date].[Date].[Date].&[20081117]}
我认为你有一个月级。表达式的第一部分将返回所有monthes但2008年11月,然后添加2008年11月17日。
编辑:
对于你的第二个例子,你可以这样写:
Except(all the cities in north america,
Except(all the cities in USA,
Except(all the cities in New York state,
{Albany , Glens Falls})))
您可以使用Descendants
功能和LEAVES
标记检索北美,美国和纽约州的城市。
答案 1 :(得分:0)
不确定通过“使用超过三个条款......任何层次结构”来理解您的意思,但这里是您要求的集合:
select
Hierarchize (
Union(
Except(
Descendants( [Start Date].[Date].[Year].[2008] , [Start Date].[Date].[Month], SELF ),
Descendants( [Start Date].[Date].[Month].&[2008]&[11], [Start Date].[Date].[Month], SELF )
),
[Start Date].[Date].[Date].&[20081117]
)
)
on 0 from [ADM]