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 之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章