【问题标题】:Tuples in MDX SSAS OLAP queries (SS management studio)MDX SSAS OLAP 查询中的元组(SS 管理工作室)
【发布时间】:2016-06-03 02:29:23
【问题描述】:

我有一个关于 MDX 元组的问题,我想了解一些让我感到困惑的事情。

我读过的大多数文献都谈到元组是一组坐标,基本上指向一个包含度量值的单元格。据我了解,元组被定义为每个维度仅包含一个不同的成员。通常,在编写查询时,我们不会为每个维度指定每个成员,而是让 SSAS 引擎使用默认成员并相应地聚合度量数据。

直出冒险作品样本OLAP数据库(立方体)《冒险作品》

我理解的一个超级简单的查询代表一个元组:

SELECT 
([Date].[Calendar Quarter of Year].&[CY Q3],[Measures].[Sales Amount]) --Tuple                          
 ON COLUMNS                             
FROM [Adventure Works]

SS Management studio 返回此结果

这里没有问题,&[CY Q3] 成员指定的元组指向包含显示的度量值的单元格。显然已经返回了一个元组。

虽然我经常使用这种东西:

select 
non empty ([Date].[Calendar].[Calendar Quarter],[Measures].[Sales Amount]) --Tuple??

 ON COLUMNS                             
FROM [Adventure Works]

它返回所述度量的所有年份的所有季度总计(不是一个很好的例子,但它只是一个例子):

我将此结果视为一个集合,因为从同一维度(日期)返回了多个不同的成员。事实上,默认情况下所有成员都被返回,如果是这样,它怎么可能是一个元组?

所以我的问题是这样的。上面查询中“元组”周围的括号向我表明我正在选择一个元组,查询引擎处理并返回一个结果,这对我来说看起来像一个集合,不是因为返回了多个单元格值,而是因为已经使用了不止一个日期维度的成员。

查询表明正在选择一个元组,并且查询引擎似乎接受它作为一个,但是结果集包括来自同一维度的多个成员和相应的单元格值,向我表明将返回多个元组--> 设置。

此外,当我将查询引擎视为集合并在其上使用集合函数时,查询引擎不会引发错误:

select 
nonempty({([Date].[Calendar].[Calendar Quarter],[Measures].[Sales Amount])}) --Set                          
 ON COLUMNS                             
FROM [Adventure Works]  

我的问题是这样的,假设我是正确的,并且结果确实代表了一个集合(由每个不同的成员实例表示的一组元组),为什么查询引擎允许您指定括号来指示元组的选择返回不是元组的东西?

这对我来说更有意义:

  SELECT
 nonemptycrossjoin(
    {[Date].[Calendar].[Calendar Quarter]}, --Set 1
    {[Measures].[Sales Amount]}  --Set 2
 )              
  ON COLUMNS                                
  FROM [Adventure Works]    

至少这段代码反映了返回的结果集 想法? 还是仅仅是分析服务语义?

谢谢

【问题讨论】:

    标签: tuples mdx


    【解决方案1】:

    不幸的是,MDX 是一种模棱两可的语言。据我了解, () 表示法是元组或运算符优先级表示法。并且:

    {...} , {...}
    

    实际上是一个交叉连接:

    {...} * {...}
    

    然后,当您指定期望集合的“级别”时,默认级别.members。当您指定一个预期集合的元组时,将使用这个唯一的元组创建一个单例集。所以:

    ( [level], [measures].[amount] )
    

    相当于:

    crossjoin( [level].members, { [measures].[amount] } )
    

    唯一指定的元组(成员是元组)是 [Measures].[Amount] 顺便说一下不使用 () 表示法;-)

    【讨论】:

      【解决方案2】:

      你提到你通常使用这种语法 - 但我几乎每天都写 mdx 并且从不使用这种语法 -

      SELECT 
        NON EMPTY ([Date].[Calendar].[Calendar Quarter],[Measures].[Sales Amount]) ON COLUMNS                             
      FROM [Adventure Works];
      

      我有点惊讶它的运行,因为它似乎指示分析服务从级别和度量成员创建一个元组。

      MarcP 提到 mdx 是模棱两可的,但我更倾向于说它可以写得模棱两可 - 不幸的是它在大多数情况下都非常优雅地失败了,你不会得到任何返回的数字或错误数字 - 我希望它抛出更多错误并执行更严格的语法规则,因为这可能使它更容易理解。

      您的原始脚本我只会使用* 运算符,而不是输入完整的crossjoin 函数当您需要它时 - 在您的脚本中,将度量移动到行并删除该元组?就像 Marc 提到 SSAS 隐式使用 MEMBERS 函数一样 - 我发现在使用它时明确包含它更具可读性:

      SELECT 
        NON EMPTY 
        [Date].[Calendar].[Calendar Quarter].MEMBERS ON 0, 
        [Measures].[Sales Amount] ON 1                            
      FROM [Adventure Works];
      

      [Date].[Calendar].[Calendar Quarter]

      正如 Marc 提到的,这实际上与 [Date].[Calendar].[Calendar Quarter].MEMBERS 相同,在这种情况下,MSDN 是你的朋友(对于 mdx,与其他一些 ms 语言不同,我发现 msdn 非常好) - 这是 MEMBERS 函数的定义:

      https://msdn.microsoft.com/en-us/library/ms144851.aspx

      告诉你返回类型:

      返回维度、级别或层次结构中的成员集合


      nonemptycrossjoin

      您提到了nonemptycrossjoin - 这不再需要 - 只需通过 * 进行简单的交叉连接即可使用最后两个或三个版本的 SSAS

      【讨论】:

      • 感谢您就脚本给出的结果建议的代码 sn-p 中的快速问题回复,您会认为结果是一组 13 个元组吗?谢谢。
      • @DES_3676 我更倾向于将返回的单元集中的每个单元格视为有效的元组 - 不确定列标题或行标题 - 我不会真正将它们归类为元组。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多