用于分层包含/排除的MDX查询

时间:2012-07-18 19:48:20

标签: sql ssas mdx

我正在尝试制作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级之间。

有效的用例将是:

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

在单词中(以及完全构造映射到这些quadkeys的地名),这将是这样的:向我显示北美的所有数据,但不显示美国的数据,除非该数据是针对纽约州的,但不是在奥尔巴尼或格伦斯瀑布。

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

2 个答案:

答案 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]