2014-10-02 3 views
0

Я имею дело с требованием, как указано ниже, решение, которое у меня есть, либо не затрагивает полную проблему, либо чрезвычайно медленное, а во многих случаях просто невозможно. Нужна небольшая помощь по тому же.MDX для расчета значений начала месяца в отдельные даты

Проблема: нужен запрос, который отображает кучу мер с кросс-соединением из 4-х измерений (10 уровней) и измерения даты, мне нужно определить первое доступное значение мер за такие периоды времени, как Начало месяца, начало год Etc ..

у меня есть

  • Dima - Уровень A1
  • dimB - Леве B1, B2, B3
  • DIMC - Уровень C1
  • dimD - Уровень D1, D2, D3, D4, D5
  • Дата Размер - дата, месяц, год как уровни.
  • Measure - M1 Для M5

Запрос:

SELECT 
    NON EMPTY {[Measures].[M1], 
       [Measures].[M2], 
       [Measures].[M3], 
       [Measures].[M4], 
       [Measures].[M5], 
       [Measures].[M1SOM]} ON COLUMNS 
    ,NON EMPTY 
      { 
    [DimA].[A1].[A1].ALLMEMBERS* 
    [DIMB].[B1].[B1].ALLMEMBERS* 
    [DIMB].[B2].[B2].ALLMEMBERS* 
    [DIMB].[B3].[B3].ALLMEMBERS* 
    [DIMB].[B4].[B4].ALLMEMBERS* 
    [DIMB].[B5].[B5].ALLMEMBERS* 
    [DIMC].[C1].[C1].ALLMEMBERS* 
    [DIMD].[D1].[D1].ALLMEMBERS* 
    [DIMD].[D2].[D2].ALLMEMBERS* 
    [DIMD].[D3].[D3].ALLMEMBERS* 
    [Date].[Date].[Date].ALLMEMBERS* 
    [Date].[Month].[Month].ALLMEMBERS* 
} ON ROWS 
FROM [Cube] 

*** Этот запрос имеет все те Перекрестные соединения, как этот запрос будет власть набор данных отчета SSRS.

Мне нужно создать новую расчетную меру или реальную (постоянную меру), которая отображает начало месяца & Начало года Значения. Ниже приведены варианты, которые у меня есть в настоящее время. Предположим, что измерение M1 является тем, для которого мне нужны значения SOM и SOY.

  1. Создать сохраненную меру (M1SOM) построен на мере M1 и обеспечивает функцию агрегации «FirstNonEmpty»: Это отлично работает, когда мы запускаем запрос на уровне месяца, то есть в приведенном выше запросе есть [Date ] [Месяц]. [Месяц]. Во всех случаях вместо [Дата]. [Дата]. [Дата]. Он отображает первое доступное непустое значение месяца. Однако это означает, что остальные меры агрегируются на уровне месяца. Если я хочу отображать ежедневные значения других мер вместе со значениями SOM для этой меры, она не будет работать, поэтому область теперь изменяется на одну дату, и я просто получаю ежедневное значение в измерении M1SOM.

  2. Создайте расчетную меру (M1SOM), как показано ниже, а также запрос выше и то же самое произойдет. Невозможно отобразить значения ЗВОЛ на уровне суточной даты.

    WITH MEMBER [Measures].[M1SOM] AS ([Date].[Date].FirstChild,[Measures].[M1])

  3. Создать вычисляемый элемент, как показано ниже, Это работает!, однако, запрос абсолютно убивает мою машину и берет навсегда выполнение, если я запускаю его с более чем тремя уровнями в крест-соединении.

    WITH MEMBER M1SOM AS Head(NonEmpty({[Date].[Date].Parent.Children}*[Measures].[M1SOM])).Item(0)

Есть ли лучший способ для достижения SOM и соевых расчетов на ежедневную уровне?

Благодаря

Srikanth

ответ

0

(это непроверенные)

вернуться ли это первая дата месяца:

WITH MEMBER [Measures].[FirstDayOfMonth] AS 
    OpeningPeriod(
     [Date].[Date].[Date], 
     [Date].[Date].CURRENTMEMBER.PARENT 
    ).MemberValue 
SELECT 
    NON EMPTY {[Measures].[M1], 
       [Measures].[M2], 
       [Measures].[M3], 
       [Measures].[M4], 
       [Measures].[M5], 
       [Measures].[FirstDayOfMonth] } ON COLUMNS 
    ,NON EMPTY 
      { 
    [DimA].[A1].[A1].ALLMEMBERS* 
    [DIMB].[B1].[B1].ALLMEMBERS* 
    [DIMB].[B2].[B2].ALLMEMBERS* 
    [DIMB].[B3].[B3].ALLMEMBERS* 
    [DIMB].[B4].[B4].ALLMEMBERS* 
    [DIMB].[B5].[B5].ALLMEMBERS* 
    [DIMC].[C1].[C1].ALLMEMBERS* 
    [DIMD].[D1].[D1].ALLMEMBERS* 
    [DIMD].[D2].[D2].ALLMEMBERS* 
    [DIMD].[D3].[D3].ALLMEMBERS* 
    [Date].[Date].[Date].ALLMEMBERS* 
    [Date].[Month].[Month].ALLMEMBERS* 
} ON ROWS 
FROM [Cube] 

(Снова непроверенных)

WITH MEMBER [Measures].[FirstDayOfMonthM1] AS 
    (
     OpeningPeriod(
     [Date].[Date].[Date], 
     [Date].[Date].CURRENTMEMBER.PARENT 
    ), 
    [Measures].[M1] 
    ) 
SELECT 
    NON EMPTY {[Measures].[M1], 
       [Measures].[M2], 
       [Measures].[M3], 
       [Measures].[M4], 
       [Measures].[M5], 
       [Measures].[FirstDayOfMonthM1] } ON COLUMNS 
    ,NON EMPTY 
      { 
    [DimA].[A1].[A1].ALLMEMBERS* 
    [DIMB].[B1].[B1].ALLMEMBERS* 
    [DIMB].[B2].[B2].ALLMEMBERS* 
    [DIMB].[B3].[B3].ALLMEMBERS* 
    [DIMB].[B4].[B4].ALLMEMBERS* 
    [DIMB].[B5].[B5].ALLMEMBERS* 
    [DIMC].[C1].[C1].ALLMEMBERS* 
    [DIMD].[D1].[D1].ALLMEMBERS* 
    [DIMD].[D2].[D2].ALLMEMBERS* 
    [DIMD].[D3].[D3].ALLMEMBERS* 
    [Date].[Date].[Date].ALLMEMBERS* 
    [Date].[Month].[Month].ALLMEMBERS* 
} ON ROWS 
FROM [Cube] 

Это выглядит довольно неплохо для игры с периодами времени: http://www.mssqltips.com/sqlservertip/2877/sql-server-analysis-serviceslead-lag-openingperiod-closingperiod-time-related-functions/

+0

Да, так оно и есть. Имеет только OpenPeriod ([Дата]. [Дата]. [Дата]). Имя также выполняет трюк. – user3198708

+0

Какова эффективность? Он все еще убивает вашу машину? – whytheq

+0

Нет, это работает очень хорошо. – user3198708

0

Так что я опубликовал тот же вопрос на форуме Msft и получил ответ ниже. Предлагаемая ими работа направлена ​​на решение проблем производительности. Но если у кого-то нет всех крестов, чтобы замедлить их, используйте один из трех вариантов, перечисленных в моем вопросе.

Like to MSFT answer

Благодаря Шри

Особая благодарность за WhyTheq За терпение и пытается решить решение. Оцените усилия.

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