【问题标题】:How to create a period over period Measurement in MDX?如何在 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>

【问题讨论】:

    标签: mdx olap mondrian


    【解决方案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 成员函数,因此需要一些上下文
    • 谢谢!我想我一定是错过了就业日期。我希望有一个适用于任何时期的通用解决方案,但我认为这可以适应使用模板的通用解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    相关资源
    最近更新 更多