MDX пересекает иерархию измерений с детальными измерениями, что приводит к дублированию статистики набора данных служб Reporting Services.

Я построил отчет о доходах SSRS в Visual Studio 2005 через источник данных SSAS 2008 R2 Qube для развертывания на MS SharePoint 2005 Server. Работает нормально (на русском):

(упс, не могу опубликовать изображение ниже 10 баллов репутации)

Но проблема в том, что отчет mdx выводит дублирующуюся статистику x2/x3/x4/x10 в разных показателях, которые загружаются на разные уровни иерархии календаря (некоторые планы имеют годовую гранулярность, другие квартальные фактические данные лежат на конечном уровне точного даты). Вот абстрактный mdx-код:

/* Revenue plan-fact report for business units 
   (simplified translated abstact,
    initially built for new 2015 and old clients) */

    /*============================================================================
      CALCULATED MEASURES
      ============================================================================*/

        WITH    
        MEMBER [is new client] AS 
        CASE       
        WHEN [Clients].[First contract calendar].CURRENTMEMBER = 
             [Clients].[First contract calendar].[Year START DATE].&[2015-01-01T00:00:00] 
        THEN 1 ELSE 0 END       

        MEMBER [Measures].[New clients - Revenue Plan] AS 
               CASE WHEN [is new client] = 1 
               THEN [Measures].[New clients - Revenue Plan]
               ELSE null END

        MEMBER [Measures].[New clients - Revenue Fact] AS 
               CASE WHEN [is new client] = 1 
               THEN [Measures].[New clients - Revenue Fact]
               ELSE null END

        MEMBER [Measures].[New cients - contracts Plan] AS 
               CASE WHEN [is new client] = 1
               THEN [Measures].[New cients - contracts Plan]
               ELSE null END

    /*============================================================================
      CONSTRACT DATA SET
      ============================================================================*/

        SELECT {[Measures].[New clients - Revenue Plan],
                [Measures].[New clients - Revenue Fact],
                [Measures].[New cients - contracts Plan]} ON COLUMNS,

        --exists(
        --nonempty(    
        CrossJoin(
                  -- dimention of client's first contract calendar 
                  -- (we need it to calculate measure of new/old client flag):
                  -- drill down from years through quarters to monthes

                  Hierarchize(DrilldownMember({
                              {DrilldownLevel({[Clients].[First contract calendar].[Year START DATE]})}},
                                              {[Clients].[First contract calendar].[Quarter START DATE]})
                              -{[Clients].[First contract calendar].[Month START DATE].&[1899-12-30T00:00:00]}),

                  -- dimention of company's business structure (to show in report rows)

                  Hierarchize(DrilldownMember({
                              {DrilldownLevel({[Business structure].[Hierarchi].[ALL]})}},
                                              {[Business structure].[Hierarchi].[LV1].&[3]})
                              -{[Business structure].[Hierarchi].[ALL],                            
                                [Business structure].[Hierarchi].[LV1].&[3],
                                [Business structure].[Hierarchi].[LV2].&[3]})               
                  )
        --))        
        ON ROWS 

        FROM [DWH_FD_client_count]

что приводит к набору данных с удвоенной статистикой на разных уровнях иерархии календаря:

(упс, не могу опубликовать изображение ниже 10 баллов репутации)

Я пробовал функции существующие (), nonempty(), nonemptycrossjoin() и filter() - но все это приводит к пробелам в статистике для части бизнес-единиц. Я полагаю, что основной проблемой является гранулярность мер Кубе. Но я не могу повлиять на это, мне нужно, чтобы цифры были хорошими на стороне mdx сервера отчетов. Может быть, мне нужно изменить блок детализации для иерархии мер [Клиенты].[Календарь первого контракта].

ПОМОГИТЕ мне, пожалуйста, ребята! Я не могу преодолеть эту проболему уже две недели

2 ответа

Решение

Вот решение, которое сработало для меня. Проблема, по-видимому, заключалась в детализации иерархии измерения [Клиенты].[Календарь первого контракта], которая вызвала неправильное пересечение его уровней с выводом избыточных строк и статистикой удвоения. Чтобы заставить работать MDX, я просто заменил этот блок кода:

Hierarchize(DrilldownMember({
                          {DrilldownLevel({[Clients].[First contract calendar].[Year START DATE]})}},
                                          {[Clients].[First contract calendar].[Quarter START DATE]})
                          -{[Clients].[First contract calendar].[Month START DATE].&[1899-12-30T00:00:00]})

только с одним вызовом атрибута иерархии:

[Clients].[First contract calendar].[Month START DATE]

Примечание: выходной набор данных в службах Reporting Services создает не только столбец Monthes, но и все его уровни родительской иерархии: годы и кварталы, которые я пытался создать с помощью функций Drilldownmember() и Drilldownlevel() изначально

Может быть, вам нужно обернуть ваши пользовательские меры в Sum или же Aggregate, Хотя эти меры должны быть рекурсивными? Вы можете попробовать изменить имена - я только что добавил XX чтобы дифференцировать их от меры, используемой в определении:

    MEMBER [Measures].[New clients - Revenue Plan XX] AS
      SUM(               
         CASE WHEN [is new client] = 1 
           THEN [Measures].[New clients - Revenue Plan]
           ELSE null END
         )
    MEMBER [Measures].[New clients - Revenue Fact XX] AS 
      SUM(               
         CASE WHEN [is new client] = 1 
           THEN [Measures].[New clients - Revenue Fact]
           ELSE null END
         )

    MEMBER [Measures].[New cients - contracts Plan XX] AS 
      SUM(               
         CASE WHEN [is new client] = 1 
           THEN [Measures].[New cients - contracts Plan]
           ELSE null END
         )
Другие вопросы по тегам