如何在 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 中组的总和?

MDX 计算的测量计数

如何预先测量静态尺寸? WINAPI

您如何使用 MDX 计算 MTD/YTD 平均工作日销售额?

在 UILocalNotification 中创建周间隔以及周期

通过终端在 InfluxDB 中创建表