子查询中的MDX where子句不切片多维数据集 - 如何理解?

时间:2015-04-10 02:02:21

标签: ssas mdx

此查询为我提供了一个商店的销售:

select
[measures].[sales] on 0
from [MyCube]
where [store].[store].[042]

但是,如果我将切片器移动到子查询内部,它会让我销售所有商店。

select
[measures].[sales] on 0
from (select
  from [MyCube]
  where [store].[store].[042]
)

如何理解这种差异背后的机制? this article中也提到了这一点,但没有太多解释。

---- ----编辑:

我尝试了各种各样的东西并阅读了一段时间。我想补充一个问题:是否存在子选择中的where子句过滤结果的情况?

此查询为我提供州MI(商店[042]属于MI)的所有商店的销售额:

select
[measures].[sales] on 0
from (select
  [store].[state].[MI] on 0
  from [myCube]
  where [store].[store].[042]
)

考虑到'内部查询只过滤了在轴上返回过滤后的维度',如果我这样做,理论证明是错误的:

select
[measures].[sales] on 0
from (select
  [store].[state].members on 0
  from [myCube]
  where [store].[store].[042]
)

子选择仍返回一个状态MI,但外部查询返回所有商店(所有状态)的销售额。

----编辑4/13 ----

使用屏幕截图重新编写AdventureWorks多维数据集中的问题。 查询1:一家商店的销售 查询2:如果where子句在子选择中,则返回所有商店的销售额。 问题3:我得到的两个答案建议我们在轴上选择维度 - 这是结果 - 我们得到所有城市。

AdventureWorks cube

2 个答案:

答案 0 :(得分:1)

以下是关于子选择和切片器辩论的一些其他好的参考文献:

http://bisherryli.com/2013/02/08/mdx-25-slicer-or-sub-cube/

https://cwebbbi.wordpress.com/2014/04/07/free-video-on-subselects-in-mdx/

Chris Webb的视频位于此处:

https://projectbotticelli.com/knowledge/what-is-a-subselect-mdx-video-tutorial?pk_campaign=tt2014cwb

这仍然应该留下All成员:

SELECT 
  [measures].[sales] ON 0
FROM 
(
  SELECT 
  FROM [MyCube]
  WHERE 
    [store].[store].[042]
);

...但商店层次结构的成员[All]现在只由[store].[store].[042]组成。 您可以通过将商店层次结构添加到ROWS

来查看
SELECT 
  [measures].[sales] ON 0,
  [store].MEMBERS ON 1
FROM 
(
  SELECT 
  FROM [MyCube]
  WHERE 
    [store].[store].[042]
);

这是AdvWorks版本,类似于您问题中的参考:

SELECT 
  {[Measures].[Order Count]} ON 0
 ,[Subcategory].MEMBERS ON 1
FROM 
(
  SELECT 
    {
      [Subcategory].[Subcategory].&[22]
    } ON 0
  FROM [Adventure Works]
);

它返回子选择中的成员,并调整All成员以考虑子选择:

enter image description here

在参考文章中,为什么[All]小于其他两个的总和 - 这不取决于子选择,而是与他选择的[Measures].[Order Count]的度量相关联,这是一个明显的数量。如果你拿走了子选择,你会看到All成员的行为与其他子类别成员的总和相同(我标记了部分总数高于All成员的点):

SELECT 
  {[Measures].[Order Count]} ON 0
 ,Order
  (
    [Subcategory].MEMBERS
   ,[Measures].[Order Count]
   ,bdesc
  ) ON 1
FROM [Adventure Works];

enter image description here

订单计数:在1个订单上可能有几个产品子类别 - 因此这种行为。


编辑

您的查询:

select
[measures].[sales] on 0
from (select
  [store].[state].members on 0
  from TestCube //<< added this!
  where [store].[store].[042]
)

这个内部脚本无效?在轴上使用相同的维度和WHERE子句无效:

select
  [store].[state].members on 0
from TestCube
where [store].[store].[042]

Edit2

mdx脚本返回一个多维数据集,可以切片或不切片,但它会返回一个多维数据集。 WHERE子句用于对返回的多维数据集进行切片。如果我们使用第三方工具,则添加到WHERE子句的维度将进入组合框 - 并选择Cliffside。但是用户可以从该组合框中有效地选择Ballard - 它只是一个切片器。 WHERE子句不会更改mdx脚本返回的多维数据集,它只会影响cellset中显示的内容。 WHERE在子选择中有效。它是定义的一部分: https://msdn.microsoft.com/en-us/library/ff487138.aspx
我从未找到子选择WHERE子句的用例。


Edit3

此链接将解释事情:
https://social.msdn.microsoft.com/Forums/sqlserver/en-US/ccb66ac3-0f9a-4261-8ccc-b6ecc51b6f07/is-where-clause-pointless-inside-a-subselect?forum=sqlanalysisservices

Darren gosbell在回答这个问题时说:

  

https://msdn.microsoft.com/en-us/library/ff487138.aspx它说:

     

WHERE子句不会过滤子空间。

答案 1 :(得分:1)

select
[measures].[sales] on 0
from (select
  from [MyCube]
  where [store].[store].[042]
)

上述查询仅将商店的范围缩小为成员[042]。请注意,在实际选择之前,执行子选择。因此,当涉及到选择时,引擎只看到一个立方体,其中包含所有维度的所有成员;但只有商店维度中的成员[store].[store].[042]。就好像多维数据集在Store维度上切掉之外的其他地方都保持完好无损。

如果您向前迈出一步,将store添加到其中一个轴上,例如

select
[measures].[sales] on 0,
[store].[store].members on 1
from (select
  from [MyCube]
  where [store].[store].[042]
)

你会看到虽然成员[All]出现在输出中,但它实际上只包含一个商店。

实质上,[All]是一个特殊成员,它是根据立方体的范围计算出来的。它反映了立方体中所有成员的综合效果。

在SQL术语中,它类似于:

select sales, store as [All] from 
(select sales, store from tbl where store = '042') tbl

即使您看到Sales----All,但这只是商店[042]

销售额的反映