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

Posted

技术标签:

【中文标题】MDX 语法:Period.Financial Year.Financial Year 和 Period.Financial Year.Children 之间的区别?【英文标题】:MDX syntax: Difference between Period.Financial Year.Financial Year and Period.Financial Year.Children? 【发布时间】:2015-08-17 20:06:44 【问题描述】:

我们有一个名为 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].[Financial Year] ]。为了获得 [Period].[Financial Year].[Financial Year],在SSMS 中,我打开了该属性层次结构,将“Financial Year”的成员下方的小点拖了出来,这就是它给我的信息。

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

    .Children 更可取,还是只是偏好?

    另外,如果要“图表”[Period].[Financial Year].[Financial Year],会是“Dimension.Level.Member”吗? [财政年度]/儿童也是成员,或者如何绘制“整个事物”和

    我应该怎么称呼整个事情?

【问题讨论】:

【参考方案1】:

不确定您所说的“图表”是什么意思。

我认为你们两个列表达式都是捷径。

这个

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

是这个的缩写

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

还有这个:

[Period].[Financial Year].CHILDREN

是这个的缩写:

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

(倒带一点)

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

所以看起来你已经利用了[Financial Year]的这两个不同层次的层次结构。


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

有时您可能想抓取 All 成员和叶子 - 然后您可以执行以下操作:

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

这应该返回一个包含 All 成员的集合?


第二季度

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


重复 Greg Galloway 的评论:

[Period].[Financial Year].CHILDREN 假定 All 成员是 默认成员和上下文中的当前成员,不会作为 适用于所有情况。

最好使用[Period].[Financial Year].[All].CHILDREN[Period].[Financial Year].[Financial Year].MEMBERS

【讨论】:

我更喜欢 [Period].[Financial Year].[Financial Year].MEMBERS,因为我认为它是最明确的。我相信 [Period].[Financial Year].CHILDREN 假设 All 成员是默认成员和当前坐标,因此您的里程可能会有所不同。但我同意我看到了很多。 我正在逐步阅读 MDX,跑到第 74 页,它解释了“在属性层次结构中,层次结构的叶级别与属性层次结构本身的名称相同”。这正是我想知道的,但也感谢您的回答。 我自己也很困惑,想着“dimension.level.member”,并没有认识到属性层次结构也像用户定义的层次结构一样,但现在我看到它们是相同的,“Dimension. Hierarchy.Level”,并且使用属性层次结构两次来获取叶子是我在 [Period].**[Financial Year].[Financial Year]** 时感到困惑的,但现在我明白了 @GregGalloway 你想让我编辑这个答案吗? 100% 乐意更改此答案中的任何内容,您认为我应该更改 - 我只是一个学习者。 p.s.很高兴在mdx 问题上见到你,先生 - 这个论坛很好用(比 MS 的 SSAS 论坛更好的技术),但缺少像你这样的真正的mdx 专家贡献者。曾经有一个很好的mdx监督者FrankPI,但我认为他厌倦了缺乏活动或许多问题的琐碎,并离开了。 @whytheq 谢谢。试图帮助缓和。我建议您编辑您的答案并提及 [Period].[Financial Year].CHILDREN 假定 All 成员是上下文中的默认成员和当前成员,并且不会在所有上下文中按预期工作。首选[期间].[财政年度].[全部].CHILDREN 或 [期间].[财政年度].[财政年度].成员【参考方案2】:

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

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

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

这个故事的寓意是我们绝对应该尽量不要落入任何“捷径”。

编辑:为什么必须明确!

.MEMBERS 之所以是“建议”方式,是因为 SSAS 引擎在您使用.MEMBERS 函数时会进行额外的检查。

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

但如果使用.MEMBERS,则会进行额外的检查,从而给出明确而明确的错误消息:

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

有点离题,但在 SQL 中,在语句末尾使用分号是标准的ANSI 语法,但很少有人真正使用这种语法。当分号不与某些运算符一起使用时,引擎会通过抛出错误来惩罚我们,例如当我们使用 CTE 时。那么我们应该养成使用更多分号的习惯吗? 该死! 这真的是捷径吗? 不!

【讨论】:

你好 Sourav - 这个说法不正确Also, the [Period].[Financial Year].[Financial Year] is not really a suggested way of invoking members.。此快捷方式被设计为语言的一部分。查看 Mosha 的这篇文章以查看它的使用情况:sqlblog.com/blogs/mosha/archive/2008/10/24/… @whytheq - 编辑了我的答案并添加了一些内容。这更像是一种最佳实践。 什么是作用域成员?无法在 Google 上找到定义。只有一个成员才能有孩子,而不是等级制度......但除了“误导”或不抛出错误之外,是否存在 Dim.Hier.Children 会返回与 Dim.Hier.All 不同的结果的情况。孩子们?我只是使用从 SSMS MDX 拖动字段时得到的方法 您看到我在问题中提到的示例了吗?如果没有,这里是:***.com/questions/25786590/… @SouravA 我同意 - 我只是在和你开玩笑,因为我发现你强调使用分号 (sql) 但在屏幕打印 (mdx) 中没有.我知道有区别(cte),但只是觉得很有趣。

以上是关于MDX 语法:Period.Financial Year.Financial Year 和 Period.Financial Year.Children 之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章

MDX

SSAS MDX WHERE 子句语法 - 从同一层次结构中过滤多个值

如何在 MDX 查询中使用第三维(ON PAGES 语法)

BI之MDX与SQL语法示例比较

MDX 子选择与性能问题

Olap 立方体和 MDX 和 NON EMPTY