2012-07-18 379 views
1

我试图手艺MDX查询来回答以下形式的问题:MDX查询层次包含/排除

显示我的所有记录在2008年,除了那些在十一月,除非它们发生在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层之间的层次结构。

一个有效的用例将随后是:

  • 选择QK0
  • 取消QK002
  • 选择QK0021230
  • 取消QK002123033201和QK002123033202

在字(和完全制造映射到这些quadkeys的地名),这将会是这样的:向我显示North A的所有数据美国,但不包括美国的数据,除非该数据是针对纽约州的,但不包括奥尔巴尼或格伦斯福尔斯。

因此,上述日期的相同查询结构必须适用于映射或任何其他层次结构集。还值得注意的是,我正在构建这个MDX以响应用户的操作。

回答

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标志。

+0

这似乎并不具有普遍性虽然。对于给定的例子它可以正常工作。我会在问题中发表另一个例子。 – 2012-07-19 12:54:00

+0

为了您的编辑,这正是我所到达的。谢谢。 – 2012-07-19 17:17:51

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] 
+0

我的意思是我想要一个可以处理任何层次结构和任意数量的包含/排除的通用解决方案。 取而代之的是Date示例,请考虑一个映射应用程序,该应用程序通过四键来分割数据。用户查询可以是:向我展示QK0中的所有内容,除了QK0012中的内容外,除非它在QK001200中,而不在QK001200132中。 (等等一个典型的quadkey分层结构是20层深)。 你有什么和我昨晚自己想的非常相似。我仍在研究它是否像所需的那样灵活。 – 2012-07-19 12:52:21

+0

我在原始问题中添加了一个大的编辑来充实这个想法。 – 2012-07-19 13:04:57