我有一个关于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]
返回所述年度所有季度的所有季度总数(不是一个很好的例子,但它仅仅是一个例子):
我将此结果视为设置,因为已从同一维度(日期)返回了多个不同的成员。事实上,默认情况下会返回所有成员,如果是这样,它怎么可能是一个元组?
所以我的问题是这个。围绕" tuple"的括号在上面的查询中,向我表明我选择了一个元组,查询引擎处理并返回一个结果给我看起来像一个集合,不是因为返回了多个单元格值而是因为多个成员从日期维度开始使用。
查询表明正在选择一个元组,并且查询引擎似乎接受它为一个但是结果集包括来自相同维度的多个成员和相应的单元格值,向我指示将返回多个元组 - >集。
此外,当我将它视为一个集合并使用set函数时,查询引擎不会抛出任何错误:
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]
至少这段代码反映了返回思想的结果集? 或者只是Analysis Services语义?
由于
答案 0 :(得分:0)
不幸的是,MDX是一种含糊不清的语言。根据我的理解,()表示法是一个元组或运算符优先表示法。和
onDomRefresh
实际上是一个交叉连接:
{...} , {...}
然后,当您指定期望集合的“级别”时,level.members是默认的。当您指定一个预期集合的元组时,将使用此唯一元组创建单例集。所以:
{...} * {...}
相当于:
( [level], [measures].[amount] )
指定的唯一元组(成员是元组)是[Measures]。[Amount]顺便说一下,不使用()表示法; - )
答案 1 :(得分:0)
你提到你通常使用这种语法 - 但我几乎每天写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
的最后两个或三个版本。