MDX 语法:Period.Financial Year.Financial 年和 Period.Financial Year.Children 之间的区别?

MDX syntax: Difference between Period.Financial Year.Financial Year and Period.Financial Year.Children?

我们有一个名为 Revenue 的多维数据集。

SELECT
    {[Measures].[Billable Hours]} on columns,
     [Period].[Financial Year].**[Financial Year]** on rows
FROM [REVENUE];

SELECT 
    {[Measures].[Billable Hours]} on columns,
     [Period].[Financial Year].**Children** on rows
FROM [REVENUE];

有一个维度 "Period",我猜属性层次结构是 Financial Year?如果我想要像 2012、2013、2014 这样的行,我必须说 [Period].[Financial Year].Children 或 [Period].[Financial Year].[财政年度]。要获得 [Period].[Financial Year].[Financial Year],在 SSMS 中,我打开了那个属性层次结构,将小点拖到 Members 下的 Financial Year,这就是它给我的内容。

两种方式都得到相同的结果。所以只是想知道,

  1. 是.Children更受欢迎,还是只是偏好?

  2. 此外,如果要 "diagram" [期间].[财政年度].[财政年度],会不会是 "Dimension.Level.Member"? [财政年度]/Children 也是成员,或者 "whole thing" 和

  3. 的图表如何
  4. 我应该怎么称呼这整件事?

不确定 "diagram" 是什么意思。

我认为你们两个专栏表达都是捷径。

这个

[Period].[Financial Year].[Financial Year]

是这个的缩写

[Period].[Financial Year].[Financial Year].MEMBERS

还有这个:

[Period].[Financial Year].CHILDREN

简称:

[Period].[Financial Year].[All].CHILDREN

(倒带一点)

所有属性层次结构都有两个级别 - 全部级别和叶级别。 all 级别只有一个成员 [All],而后者又有成员 - 叶子。还有叶子层,由叶子组成。

看来您已经进入了层次结构的这两个不同级别 [Financial Year]


你应该使用哪个?有时我不相信这很重要。在更复杂的场景中,您使用的可能会对性能产生影响。

有时您可能想获取所有成员和树叶 - 然后您可以执行如下操作:

SELECT 
    {[Measures].[Billable Hours]} on columns,
     [Period].[Financial Year].MEMBERS on rows
FROM [REVENUE]; 

这应该return一个包含所有成员的集合?


Q2

这个[Period].[Financial Year].[Financial Year]Dimension.Hierarchy.Level。层次结构的所有成员在此级别不可访问。


重复 Greg Galloway 的评论:

[Period].[Financial Year].CHILDREN assumes the All member is the default member and the current member in the context and won't work as intended in all contexts.

Preferable to use [Period].[Financial Year].[All].CHILDREN or [Period].[Financial Year].[Financial Year].MEMBERS

约翰,我以前也遇到过类似情况,并在上面发了一个question on SO

重点在于,它不仅仅是一个捷径,而是一个冒险实践写 [Dim].[Attribute].CHILDREN,因为 [All] 成员,另一个答案谈论的是 scoped 成员 而它 不能 总是假设你实际上写的是 [Dim].[Attribute].[All].CHILDREN,除非你写了额外的 [All]。最好避免它。

此外,[Period].[Financial Year].[Financial Year] 不是 真正推荐的调用成员的方法。

这个故事的寓意是我们绝对应该尽量不上当 "shortcuts"。

编辑:为什么必须明确说明!

之所以.MEMBERS是"suggested"方式是因为SSAS引擎在你使用.MEMBERS函数时会做额外的检查。

如果新手 MDX 编码器不小心使用了不存在的层次结构名称(打字错误..使用 Calendar1 而不是 Calendar,引擎出人意料地没有抛出任何错误。(请原谅我的白色以下图片下方的空白)

但如果使用 .MEMBERS,则会发生额外的检查层,从而给出清晰明确的错误消息:

显然,这里的引擎是罪魁祸首,这可能是一个错误。但是,我们必须尽自己的一份力量来使用手头的工具。 以类似的方式,10 次中有 9 次 Dim.Hier.CHILDREN 语法会起作用,但事实是,它具有误导性。新手可能会查看代码并假设层次结构可以有 children。而事实是只有会员才能拥有children。

有点离题,但在 SQL 中也是如此,在语句末尾使用分号是标准的 ANSI 语法,但很少有人真正使用该语法。当某些操作符没有使用分号时,引擎反过来会通过抛出错误来惩罚我们,比如当我们使用 CTE 时。那么我们应该养成使用更多分号的习惯吗? 见鬼! 这真的是一条捷径吗? 没有!