Куб Azure OLAP, дающий неверные итоги - PullRequest
1 голос
/ 23 октября 2019

Мы используем службы аналитики Azure для размещения наших кубов. Мы столкнулись с проблемой при чтении данных через EXCEL.

Проблема в том, что итоговые значения (и промежуточные итоги) рассчитываются неправильно. Изначально мы нашли эту проблему в EXCEL. В строке итоговой суммы сводной таблицы отображалась неправильная сумма, которая должна быть суммой для всех строк. Позже выяснилось, что мы можем воспроизвести проблему также в запросе MDX.

Значения столбцов задаются вычисляемым показателем, который вычисляет проданные позиции (объем) продукта год назад.

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

Вот формула DAX, используемая для расчета объема:

IF ( 
    HASONEVALUE( 'Calendar'[Year] ),
    CALCULATE( 
        [volume],
        FILTER( 
            ALL( Calendar ),
            'Calendar'[Year] = VALUES( 'Calendar'[Year] )-1
            && 'Calendar'[ISO_DAY] <= MAX( 'Calendar'[ISO_DAY] )
        )
    ),
    IF(ISBLANK([Turnover]),BLANK(),CALCULATE([Volume],SAMEPERIODLASTYEAR(DATESBETWEEN('Calendar'[PK_Date],[MinSalesDateThisYear],[MaxSalesDate]))))
)
  • Оборот - сумма и фильтрация по магазинам
  • Объем - сумма и фильтрация по магазинам
  • MinSalesDateThisYear - первый день текущего года
  • MaxSalesDate - последнийдень, когда мы продали продукт

Заявленный профилировщик SSMS и захватил то, что генерирует EXCEL.

Без фильтра по годам (неверные итоги):

SELECT 
  { 
    [Measures].[Volume LYTD] 
  } DIMENSION PROPERTIES parent_unique_name, hierarchy_unique_name ON COLUMNS, 
  NON EMPTY HIERARCHIZE( 
    ADDCALCULATEDMEMBERS( 
      { 
        DRILLDOWNLEVEL({ 
          [Products].[Product].[All] 
        }) 
      } 
    ) 
  ) DIMENSION PROPERTIES parent_unique_name, hierarchy_unique_name ON ROWS 
FROM (SELECT 
       ( 
         { 
           [Products].[Product].&[1],
           [Products].[Product].&[2],
           [Products].[Product].&[3],
           [Products].[Product].&[4],
           [Products].[Product].&[5],
            ...
         } 
       ) ON COLUMNS 
     FROM [MyCube]) 
WHERE ( 
        [Calendar].[YW].[All] 
      ) CELL PROPERTIES value, format_string, language, back_color, fore_color, 
font_flags 
-----       Volume LYTD
All         126715
Product1    26337
Product2    14525
Product3    9602
Product4    42492
Product5    28494
Product6    5154

С фильтром года (правильные итоги):

SELECT 
  NON EMPTY HIERARCHIZE( 
    ADDCALCULATEDMEMBERS( 
      { 
        DRILLDOWNLEVEL({ 
          [Products].[Product].[All] 
        }) 
      } 
    ) 
  ) DIMENSION PROPERTIES parent_unique_name, hierarchy_unique_name ON COLUMNS 
FROM (SELECT 
       ( 
         { 
           [Products].[Product].&[1],
           [Products].[Product].&[2],
           [Products].[Product].&[3],
           [Products].[Product].&[4],
           [Products].[Product].&[5],
            ...
         } 
       ) ON COLUMNS 
     FROM [MyCube]) 
WHERE ( 
        [Calendar].[YW].[Year].&[2018], 
        [Measures].[Volume LYTD] 
      ) CELL PROPERTIES value, format_string, language, back_color, fore_color, 
font_flags 
All     roduct1 Product2    Product3    Product4    Product5    Product6    Product7    Product8    Product9    Product10
150060  3352    11545       24037       4           11848       4           4           55088       35049       9129

Я не могу понять, что здесь происходит. Я также обнаружил, что в статье MS указано, что EXCEL неправильно вычисляет итоги из-за порядка выполняемой им операции, но, поскольку я могу воспроизвести это при запросе MDX, я подозреваю, что это что-то из функций DAX или куба.

У кого-нибудь есть идеи, что я могу делать дальше?

Кроме того, я знаю, что, возможно, не предоставил некоторую информацию, поэтому, пожалуйста, спросите. Я буду рад предоставить их.

Примечание: я знаю, что есть запись с аналогичной проблемой, но я думаю, что эта проблема немного отличается, и плюс я не хотелпохитить этот пост.

1 Ответ

0 голосов
/ 24 октября 2019

Попробуйте подсчитать по году, затем сверните:

SUMX( 
    VALUES( 'Calendar'[Year] ),
    CALCULATE( 
        [volume],
        FILTER( 
            ALL( Calendar ),
            'Calendar'[Year] = VALUES( 'Calendar'[Year] )-1
            && 'Calendar'[ISO_DAY] <= MAX( 'Calendar'[ISO_DAY] )
        )
    )
)
...