1

我正在尝试制作一个 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 日)被排除消除了。我尝试在第一个联合中维护重复项,但是排除(减号运算符)会消除所有匹配的成员副本。

编辑:

这是另一个示例,可帮助您理解我要求“可概括”解决方案时的意思。

考虑一个地图应用程序,用户可以在其中选择查看他们选择的地理区域中的数据。他们通过放大和缩小地图以及选择/取消选择四键来选择这些区域。Quadkeys 巧妙地映射到一个层次结构,该层次结构通常在 18 到 23 层之间。

一个有效的用例将是:

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

用文字(并完全虚构映射到这些四键的地名),这将类似于:显示北美的所有数据,但不显示美国的数据,除非该数据是针对纽约州的,而不是在奥尔巴尼或格伦斯瀑布。

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

4

2 回答 2

3

子选择中,您只需将其放在列上:

{Except([Start Date].[Date].Month.Members, {[Start Date].[Date].[Month].&[2008]&[11]}), [Start Date].[Date].[Date].&[20081117]}

我假设你有一个月的水平。表达式的第一部分将返回除 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标志检索北美、美国和纽约州的城市。

于 2012-07-18T21:29:26.723 回答
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]
于 2012-07-19T00:47:14.427 回答