如何在 MDX 中创建周期测量?
Posted
技术标签:
【中文标题】如何在 MDX 中创建周期测量?【英文标题】:How to create a period over period Measurement in MDX? 【发布时间】:2012-03-27 18:43:12 【问题描述】:我对 MDX 查询还很陌生,我无法理解如何计算一个周期对周期的测量。例如,假设我有一个像收入这样的指标,并且我会随着时间的推移逐月分解该收入。我将如何计算该收入从月份到月份的变化百分比?现在假设我想在任何时期、季度到季度、年到年、月到月进行一般计算,甚至将其与前几年的相同时期进行比较。 2011 Q1 vs 2012 Q1、2011 Q2 vs 2012 Q2等
架构定义:
<Dimension type="TimeDimension" highCardinality="false" name="Time">
<Hierarchy name="yearQuarterMonth" caption="Year/Quarter/Month" hasAll="true" primaryKey="id">
<Table name="Time"/>
<Level name="Year" column="year" type="Numeric" uniqueMembers="true" levelType="TimeYears" hideMemberIf="Never"/>
<Level name="Quarter" column="quarter" type="Numeric" uniqueMembers="false" levelType="TimeQuarters" hideMemberIf="Never"/>
<Level name="Month" column="month" type="Numeric" ordinalColumn="month" uniqueMembers="false" levelType="TimeMonths" hideMemberIf="Never"/>
<Level name="Day" column="day" type="Numeric" uniqueMembers="false" levelType="TimeDays" hideMemberIf="Never"/>
</Hierarchy>
<Hierarchy name="fiscalYearQuarterMonth" caption="Fiscal Year/Quarter/Month" hasAll="true" primaryKey="id">
<Table name="Time"/>
<Level name="Fiscal Year" column="fiscal_year" type="Numeric" uniqueMembers="true" levelType="TimeYears" hideMemberIf="Never"/>
<Level name="Quarter" column="quarter" type="Numeric" uniqueMembers="false" levelType="TimeQuarters" hideMemberIf="Never"/>
<Level name="Month" column="month" type="Numeric" ordinalColumn="month" uniqueMembers="false" levelType="TimeMonths" hideMemberIf="Never"/>
<Level name="Day" column="day" type="Numeric" uniqueMembers="false" levelType="TimeDays" hideMemberIf="Never"/>
</Hierarchy>
<Hierarchy name="yearMonth" caption="Year/Month" hasAll="true" primaryKey="id">
<Table name="Time"/>
<Level name="Year" column="year" type="Numeric" uniqueMembers="true" levelType="TimeYears" hideMemberIf="Never"/>
<Level name="Month" column="month" type="Numeric" ordinalColumn="month" uniqueMembers="false" levelType="TimeMonths" hideMemberIf="Never"/>
<Level name="Day" column="day" type="Numeric" uniqueMembers="false" levelType="TimeDays" hideMemberIf="Never"/>
</Hierarchy>
<Hierarchy name="fiscalYearMonth" caption="Fiscal Year/Month" hasAll="true" primaryKey="id">
<Table name="Time"/>
<Level name="Fiscal Year" column="fiscal_year" type="Numeric" uniqueMembers="true" levelType="TimeYears" hideMemberIf="Never"/>
<Level name="Month" column="month" type="Numeric" ordinalColumn="month" uniqueMembers="false" levelType="TimeMonths" hideMemberIf="Never"/>
<Level name="Day" column="day" type="Numeric" uniqueMembers="false" levelType="TimeDays" hideMemberIf="Never"/>
</Hierarchy>
</Dimension>
【问题讨论】:
【参考方案1】:对于 Period over Period 计算,您需要考虑使用 PrevMember 函数... http://msdn.microsoft.com/en-us/library/ms144719.aspx
下面是一个 sn-p,它可以让您在 Period over Period 上有个良好的开端...
WITH
MEMBER [Measures].[WO Actual Amount PP] AS
(
[Order Date].[Calendar].CurrentMember.PrevMember
,[Measures].[WO Actual Amount]
)
,FORMAT_STRING = "Currency"
MEMBER [Measures].[Prior Period Growth %] AS
IIF(
[Measures].[WO Actual Amount PP] = 0
,'N/A'
,([Measures].[WO Actual Amount]-[Measures].[WO Actual Amount PP])/[Measures].[WO Actual Amount PP]
)
,FORMAT_STRING = "Percent"
SELECT
NON EMPTY
[Measures].[WO Actual Amount],
[Measures].[WO Actual Amount PP],
[Measures].[Prior Period Growth %]
ON 0,
NON EMPTY
[Order Date].[Calendar Year].[Calendar Year].Members
ON 1
FROM
[<<cube name>>]
对于上一年同期或计算,您需要查看 ParallelPeriod 函数... http://msdn.microsoft.com/en-us/library/ms145500.aspx
下面是一个 sn-p,它可以让您在 Year over Year 上有一个良好的开端...
WITH
MEMBER [Measures].[WO Actual Amount YoY] AS
(
ParallelPeriod(
[Order Date].[Calendar].[Calendar Year]
,1
,[Order Date].[Calendar].CurrentMember
)
,[Measures].[WO Actual Amount]
)
,FORMAT_STRING = "Currency"
MEMBER [Measures].[Prior Period Growth %] AS
IIF(
[Measures].[WO Actual Amount YoY] = 0
,'N/A'
,([Measures].[WO Actual Amount]-[Measures].[WO Actual Amount YoY])/[Measures].[WO Actual Amount YoY]
)
,FORMAT_STRING = "Percent"
SELECT
NON EMPTY
[Measures].[WO Actual Amount],
[Measures].[WO Actual Amount YoY],
[Measures].[Prior Period Growth %]
ON 0,
NON EMPTY
[Order Date].[Calendar Month].[Calendar Month].Members
ON 1
FROM
[<<cube name>>]
【讨论】:
我尝试翻译第一个示例,但我得到一个空的 PP 列。订单日期结构如何做到这一点?我有一个日期维度,下面有多个层次结构(年/季度/月,年/月,财年/季度/月,财年/月)。所以我的成员看起来像:成员 [Measures].[Head Count PP] as ([employmentDate.yearMonth].CurrentMember.PrevMember, [Measures].[Head Count]),但它似乎永远不会返回任何东西。在表中,我没有时间戳或日期列,但在整数字段中细分了年、财年、季度、月。我需要一个真实的日期列才能让这些东西起作用吗? 您能否用您的日期维度的屏幕截图更新您的原始帖子,以便我更好地了解您正在使用什么? 我认为应该没问题...零月数字有点奇怪,但应该没关系。当您尝试复制计算的成员时,您是否将 [employmentDate] 维度中的任何成员放在列轴或行轴上?如果不是,那么计算的成员将不会返回任何内容......因为它引用了 CurrentMember 成员函数,因此需要一些上下文 谢谢!我想我一定是错过了就业日期。我希望有一个适用于任何时期的通用解决方案,但我认为这可以适应使用模板的通用解决方案。以上是关于如何在 MDX 中创建周期测量?的主要内容,如果未能解决你的问题,请参考以下文章
您如何使用 MDX 计算 MTD/YTD 平均工作日销售额?