Как создать период над периодом измерения в многомерных выражениях?

Я новичок в запросах многомерных выражений, и мне сложно понять, как можно вычислить период по измерению периода. Например, у меня есть такая метрика, как доход, и я разбиваю этот доход по времени, скажем, по месяцам. Как я могу рассчитать изменение этого дохода от месяца к месяцу в процентах? Теперь предположим, что я хочу рассчитать это в общем за любой период, квартал за кварталом, год за годом, месяц за месяцем или даже сравнить это с аналогичными периодами прошлых лет. 1 квартал 2011 г. по сравнению с 1 кварталом 2012 г., 2 квартал 2011 г. по сравнению со 2 кварталом 2012 г. и т. Д.

Измерение времени

Определение схемы:

<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>

person chubbsondubs    schedule 27.03.2012    source источник


Ответы (1)


Для расчетов «Период за периодом» вы захотите изучить использование функции PrevMember ... http://msdn.microsoft.com/en-us/library/ms144719.aspx

Ниже приведен фрагмент, который должен дать вам хорошее начало работы с периодом над периодом ...

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

Ниже приведен фрагмент, который должен дать вам хорошее начало из года в год ...

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>>]
person Bill Anton    schedule 28.03.2012
comment
Я попытался перевести первый пример, но у меня остался пустой столбец PP. Как для этого используется структура даты заказа? У меня есть измерение даты с несколькими иерархиями внизу (год / квартал / месяц, год / месяц, финансовый год / квартал / месяц, финансовый год / месяц). Таким образом, мой член выглядел так: с элементом [Меры]. [Подсчет количества сотрудников] как ([Дата найма.годМесяц] .CurrentMember.PrevMember, [Меры]. [Подсчет количества людей]), но он, кажется, никогда ничего не возвращает. В таблице у меня нет метки времени или столбца даты, но год, финансовый год, квартал, месяц разбиты на целочисленные поля. Нужен ли мне столбец с истинной датой, чтобы все это работало? - person chubbsondubs; 28.03.2012
comment
Можете ли вы обновить исходный пост, добавив снимок экрана с датой, чтобы я мог лучше понять, с чем вы работаете? - person Bill Anton; 28.03.2012
comment
Я думаю, это должно быть хорошо ... номер нулевого месяца немного странный, но не имеет значения. Помещали ли вы какие-либо элементы из измерения [JobDate] на ось столбца или строки, когда пытались реплицировать вычисляемый элемент? Если нет, то вычисляемый член ничего не вернет ... потому что он ссылается на функцию-член CurrentMember, поэтому должен быть какой-то контекст. - person Bill Anton; 30.03.2012
comment
Спасибо! Я думаю, что я, должно быть, пропустил включение ActivityDate. Я надеялся, что будет универсальное решение для любого периода, но я думаю, что его можно адаптировать к универсальному решению с помощью шаблонов. - person chubbsondubs; 20.04.2012