此查询为我提供了一个商店的销售:
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:我得到的两个答案建议我们在轴上选择维度 - 这是结果 - 我们得到所有城市。
答案 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
成员以考虑子选择:
在参考文章中,为什么[All]
小于其他两个的总和 - 这不取决于子选择,而是与他选择的[Measures].[Order Count]
的度量相关联,这是一个明显的数量。如果你拿走了子选择,你会看到All成员的行为与其他子类别成员的总和相同(我标记了部分总数高于All成员的点):
SELECT
{[Measures].[Order Count]} ON 0
,Order
(
[Subcategory].MEMBERS
,[Measures].[Order Count]
,bdesc
) ON 1
FROM [Adventure Works];
订单计数:在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
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]