2015-07-09 5 views
1

Может ли YTD обрабатывать диапазон дат?MDX YTD over range (:)

Я пытаюсь сравнить период X дней текущего года с тем же периодом предыдущего года.

Мой MDX запрос выглядит следующим образом:

WITH MEMBER [Measures].[Prior YTD Amount] AS SUM 
(
    YTD 
    (
     ParallelPeriod 
     (
     [Date].[Year], 
     1, 
     [Date].CurrentMember 
    ) 
    ) 
    , 
    [Measures].[Amount] 
) 
set [ColSet] as 
{ 
    [Measures].[Amount], 
    [Measures].[Prior YTD Amount] 
} 
set [RowSet] as 
{ 
    [Motif].[Categorie].Members 
} 
SELECT 
NON EMPTY [ColSet] ON COLUMNS, 
NON EMPTY [RowSet] ON ROWS 
FROM [Things] 
WHERE 
{ 
    [Date].[2015].[2].[1]:[Date].[2015].[2].[9] 
} 

Я работаю с Мондриана 3.6.

ответ

2

Вкратце, этот код не будет работать. Причина в том, что следующая строка кода ищет одного члена иерархии вы применили Currentmember к:

[Date].CurrentMember

У вас есть более чем один элемент в наборе [Date].[2015].[2].[1]:[Date].[2015].[2].[9]


Вот небольшое доказательство выше:

Этот сценарий:

WITH 
    MEMBER [Measures].[x] AS 
    [Date].[Calendar].CurrentMember.Member_Key 
SELECT 
    {[Product].[Category].[All Products]} ON 0 
,{[Measures].[x]} ON 1 
FROM [Adventure Works] 
WHERE 
    { 
     [Date].[Calendar].[Date].&[20080322] 
    }; 

возвращает это:

enter image description here

В то время как этого сценария:

WITH 
    MEMBER [Measures].[x] AS 
    [Date].[Calendar].CurrentMember.Member_Caption 
SELECT 
    {[Product].[Category].[All Products]} ON 0 
,{[Measures].[x]} ON 1 
FROM [Adventure Works] 
WHERE 
    { 
     [Date].[Calendar].[Date].&[20080322] 
    : 
     [Date].[Calendar].[Date].&[20080323] 
    }; 

Возвращает это:

enter image description here

Сообщение об ошибке:

enter image description here


В AdvWrks я просто написал следующее, который может помочь, если вы можете переместить целевой диапазон дат от пункта WHERE к имени набора.

Как это работает:

1.Finds первый день в вашем имени установить через .Item(0).Item(0)
2.Finds последняя дата в имени установить через .Item([myStartDates].Count - 1).Item(0)
3.THE использует две даты поиска, чтобы создать диапазон, который параллелен

WITH 
    SET [myStartDates] AS 
    { 
     [Date].[Calendar].[Date].&[20080322] 
     : 
     [Date].[Calendar].[Date].&[20080323] 
    } 
    SET [parallelToFirst] AS 
    ParallelPeriod 
    (
     [Date].[Calendar].[Calendar Year] 
    ,1 
    ,[myStartDates].Item(0).Item(0) 
    ) 
    SET [parallelToLast] AS 
    ParallelPeriod 
    (
     [Date].[Calendar].[Calendar Year] 
    ,1 
    ,[myStartDates].Item(
     [myStartDates].Count - 1).Item(0) 
    ) 
    SET [Rebuild] AS 
    [parallelToFirst].Item(0) : [parallelToLast].Item(0) 
SELECT 
    {} ON COLUMNS 
,[Rebuild] ON ROWS 
FROM [Adventure Works]; 

достаточно легко просуммировать этот диапазон и вставьте его в измерении дата:

WITH 
    SET [myStartDates] AS 
    { 
     [Date].[Calendar].[Date].&[20080322] 
     : 
     [Date].[Calendar].[Date].&[20080323] 
    } 
    SET [parallelToFirst] AS 
    ParallelPeriod 
    (
     [Date].[Calendar].[Calendar Year] 
    ,1 
    ,[myStartDates].Item(0).Item(0) 
    ) 
    SET [parallelToLast] AS 
    ParallelPeriod 
    (
     [Date].[Calendar].[Calendar Year] 
    ,1 
    ,[myStartDates].Item(
     [myStartDates].Count - 1).Item(0) 
    ) 
    SET [ParallelRange] AS 
    [parallelToFirst].Item(0) : [parallelToLast].Item(0) 
    MEMBER [Date].[Calendar].[parallelSum] AS 
    Sum([ParallelRange]) 
SELECT 
    { 
    [myStartDates] 
    ,[ParallelRange] 
    ,[Date].[Calendar].[parallelSum] 
    } ON 0 
,{ 
    [Measures].[Internet Sales Amount] 
    ,[Measures].[Internet Order Quantity] 
    } ON 1 
FROM [Adventure Works]; 

Вот результат (только доказать, что это делает то, что мы хотим):

enter image description here

+0

Эй, хорошей попытки. Добавили еще один возможный подход. – SouravA

+0

Спасибо за ваш ответ. Теперь я должен сделать это в соответствии с моим использованием: мой процесс должен генерировать такие запросы ... – jBravo

+0

@jBravo Я не уверен, как работает Mondrian - есть ли способ введения параметров? В «SSRS» это возможно. В «Pyramid» (с которой я играю) это очень просто: поэтому я могу легко параметризовать первый набор '[myStartDates]' – whytheq

0

Ниже приводится альтернативный подход, к использованию ParallelPeriods функции. Я предполагаю, что у вас есть все даты из прошлого года в кубе, т. Е.нет промежутков между промежутками или «пробелами». Если это так, вы можете использовать функцию LAG, чтобы перейти к дате 365 дней (1 год) назад. Кроме того, сначала укажите даты с текущего года в наборе. Таким образом, вы можете легко их параметризовать.

Ваш последний MDX должен выглядеть примерно как:

with set Dates as 
{ 
    [Date].[2015].[2].[1] 
    : 
    [Date].[2015].[2].[9] 
}//<<This can be also written as 
//StrToSet("{[Date]."+ @DateStart + ":" + "[Date]."+ @DateEnd + "}") 
//@Date1 and @Date2 being the parameters you can pass from front end 

set datesPrevYear as 
{ 
    head(Dates, 1).item(0).LAG(365).item(0) \\<<Gets the starting date's 1 year previous date 
    : 
    tail(Dates, 1).item(0).LAG(365).item(0) \\<<Gets the ending date's 1 year previous date 
} 

member [Measures].[Prior YTD Amount] as 
sum(datesPrevYear, [Measures].[Amount]) 

set [ColSet] as 
{ 
    [Measures].[Amount], 
    [Measures].[Prior YTD Amount] 
} 
set [RowSet] as 
{ 
    [Motif].[Categorie].Members 
} 

select 
non empty [ColSet] on columns, 
non empty [RowSet] on rows 
from [Things] 
+0

добавьте логику для високосного года – whytheq

+0

О, мужчина! Это будет перетащить. Возможно, позже я добавлю остальную логику. – SouravA

+0

он matey: не волнуйтесь, я только дразнил тебя. Я только что заметил hardcoded '365'. – whytheq

Смежные вопросы