2015-12-23 4 views
1

Я пытаюсь найти все записи между текущей датой -30 дней. Но не смог написать для этого фильтр MDX. Мой текущий запрос:Теперь() в where where в запросе MDX

WITH 
    SET [~FILTER] AS 
    {[Created_Date.Created_Hir].[Created_On].Members} 
SET [~ROWS] AS 
    {[Sales Order Attributes SO.Sales_order].[Sales Order ID].Members} 
    SELECT 
    NON EMPTY {[Measures].[CONT_AMT_GROSS]} ON COLUMNS, 
    NON EMPTY [~ROWS] ON ROWS 
    FROM [SALES_ORDER] 
    WHERE [~FILTER] 

который извлекает все записи.

+0

Расскажите еще, как даты хранятся в вашей таблице дат. Является ли он предварительно заполнен некоторыми диапазонами или есть ли даты только для дней транзакции? Дата сегодняшней даты? – SouravA

+0

Hi Sourav, Я добавил дату в формате yyyyMMdd. это предварительно заполненный стол. Для примера WITH SET [~ FILTER] AS {[Created_Date.Created_Hir]. [Created_On]. [20140220]} SET [~ ROWS] AS {[Атрибуты заказа клиента SO.Sales_order]. [Идентификатор заказа клиента] .Members} ВЫБРАТЬ непустой {[Measures]. [CONT_AMT_GROSS]} на колонны, непустой [~] ROWS РЯДОВ нА FROM [sales_order] WHERE [~ FILTER] с этим запросом я в состоянии принести запись с транзакцией, произошедшей в 2014-02-20, поэтому, используя указанный выше запрос, я хотел получить все записи между ними() - 30 дней. Спасибо, – malay

+0

@malay сделал или sourav или я отвечу на ваш вопрос? – whytheq

ответ

0

Вот пример нахождения сегодня в кубе AdvWrks вместе с 30 предыдущих дней:

WITH 
    MEMBER [Measures].[Key for Today] AS 
    Format 
    (
     Now() 
    ,'yyyyMMdd' 
    ) 
    MEMBER [Measures].[Key for Today (AW)] AS 
    '2007' + Right([Measures].[Key for Today],4) 
    MEMBER [Measures].[Today string] AS 
    '[Date].[Calendar].[Date].&[' + [Measures].[Key for Today (AW)] + ']' 
    SET [Today] AS 
    StrToMember 
    (
     [Measures].[Today string] 
    ,constrained 
    ) 
    SET [Last30Days] AS 
    [Today].Item(0).Item(0).Lag(30) : [Today].Item(0).Item(0) 
SELECT 
    {} ON 0 
,[Last30Days] ON 1 
FROM [Adventure Works]; 

Результаты в этом:

enter image description here

Так что, если мы хотим изменить выше так что мы получаем только объем продаж в Интернете за последние 30 дней:

WITH 
    MEMBER [Measures].[Key for Today] AS 
    Format 
    (
     Now() 
    ,'yyyyMMdd' 
    ) 
    MEMBER [Measures].[Key for Today (AW)] AS 
    '2007' + Right([Measures].[Key for Today],4) 
    MEMBER [Measures].[Today string] AS 
    '[Date].[Calendar].[Date].&[' + [Measures].[Key for Today (AW)] + ']' 
    SET [Today] AS 
    StrToMember 
    (
     [Measures].[Today string] 
    ,constrained 
    ) 
    SET [Last30Days] AS 
    [Today].Item(0).Item(0).Lag(30) : [Today].Item(0).Item(0) 
    MEMBER [Date].[Calendar].[All].[Last30Days] AS 
    Aggregate([Last30Days]) 
SELECT 
    {[Measures].[Internet Sales Amount]} ON 0 
FROM [Adventure Works] 
WHERE [Date].[Calendar].[All].[Last30Days]; 

. Применительно к вашему сценарию вышесказанное выглядело примерно так:

WITH 
    MEMBER [Measures].[Key for Today] AS 
    Format 
    (
     Now() 
    ,'yyyyMMdd' 
    ) 
    MEMBER [Measures].[Today string] AS 
    '[Created_Date.Created_Hir].[Created_On].&[' + [Measures].[Key for Today] + ']' 
    SET [Today] AS 
    StrToMember 
    (
     [Measures].[Today string] 
    ,constrained 
    ) 
    SET [~FILTER] AS 
    [Today].Item(0).Item(0).Lag(30) : [Today].Item(0).Item(0) 
    MEMBER [Created_Date.Created_Hir].[All].[~FILTERaggregated] AS 
    //MEMBER [Created_Date.Created_Hir].[Created_On].[All].[~FILTERaggregated] AS //<<if above is throwing an exception then try this instead 
    Aggregate([~FILTER]) 
    SET [~ROWS] AS 
    { 
     [Sales Order Attributes SO.Sales_order].[Sales Order ID].MEMBERS 
    } 
SELECT 
    NON EMPTY 
    {[Measures].[CONT_AMT_GROSS]} ON COLUMNS 
,NON EMPTY 
    [~ROWS] ON ROWS 
FROM [SALES_ORDER] 
WHERE 
    [Created_Date.Created_Hir].[All].[~FILTERaggregated]; 
+0

'[Created_Date.Created_Hir]. [Все]. [~ FILTER];'? Будет ли это работать? – SouravA

+0

@SouravA это может быть лучше [[Created_Date.Created_Hir]. [Created_On]. [All]. [~ FILTER] ' – whytheq

+0

Вы поставили псевдоним набора вместо имени участника. Не будет ли это ошибка? – SouravA

1

Ниже следует работать в качестве даты «фильтра»

Filter 
    ( 
    [Created_Date].[Created_Hir].[Created_On].Members, 
    DateDiff 
     ( 
     "d", 
     CDate([Created_Date].[Created_Hir].MEMBER_VALUE), 
     Now() 
     ) <=30 
    ) 

Не использовать именованный набор как у вас в примере, если вы не хотите столкнуться с проблемами производительности.

Сообщите мне, если производительность недостаточно.

+0

Благодаря Sourav Для вашего быстрого реагирования, – malay

+0

Благодаря Sourav Для вашего быстрого реагирования, я попробовал выше запрос, но он дает мне эту ошибку вызвано следующими причинами: mondrian.olap.MondrianException: Mondrian Ошибка: Нет функции не соответствует подписи «DateDiff (, <Числовое выражение>, ) ' Кроме того, когда я попытался сделать запрос на [Created_Date.Created_Hir] .CurrentMember.Value он бросает Вызванный: mondrian.olap.MondrianException: Mondrian Ошибка: нет функции не соответствует подписи' {<Числовое выражение>} ' также просто хотел сказать, чем в моем бэкенде. Я использую vertica в качестве базы данных, но vertica имеет функцию датирования. – malay

+0

Mondrian - это боль в ***, когда дело доходит до функций, которые он поддерживает. Позвольте мне проверить документацию Mondrian для эквивалентной функции. – SouravA