2017-01-30 16 views
0

У меня есть таблица фактов, содержащая позиции позиций и соответствующий номер заказа. Он имеет около 250 миллионов рядов.Таблица самофильтрации с DAX в табличной модели очень медленная

Моя цель - создать меру, которая может быть использована для ответа на следующий вопрос: каков общий доход от всех заказов, содержащих продукт xyz.

Я добавил таблицу, содержащую все отдельные номера статей, называемые Orderfilter, с одним столбцом OrderFilter [ArticleNr]. Эта таблица используется для фильтрации таблицы заказов. Эта таблица не связана с таблицей заказов.

Основываясь на этой настройке, я создал следующую меру.

Orderfilter Sum sales:=SUMX(
CALCULATETABLE (
    Orders; 
    FILTER (
     Orders; 
     CONTAINS (
      CALCULATETABLE (
       VALUES(Orders[OrderNr]); 
       FILTER (
        Orders; 
        CONTAINS (
         VALUES (Orderfilter[ArticleNr]); 
         Orderfilter[ArticleNr]; 
         Orders[ArticleNr] 
        ) 
       ) 
      ); 
      Orders[OrderNr]; 
      Orders[OrderNr] 
     ) 
    ) 
); 
Orders[Salesamount] 
) 

Этот расчет сам по себе работает, но он очень медленный. Когда я пытаюсь использовать его в Excel, помещая иерархии в строки, он истекает.

Есть ли возможность настроить этот запрос?

С уважением, Henning Lange

Обновление: Желаемая Result таблицы (на самом деле не знаю, как добавить таблицы здесь ...)

Стол заказов. Если я фильтрую для ArticleNr = 2, я хочу сохранить «< - Keep» -rows.

|OrderNr  |ArticleNr |  
|1   |1   | <- Keep  
|1   |***2*** | <- Keep  
|2   |1   |  
|2   |3   |  
|3   |***2*** | <- Keep 
+1

Почему вы не создаете отношения между обеими таблицами? он будет более функциональным, чем использование ** CONTAINS ** функции в ** ФИЛЬТРЕ **. Явные отношения всегда быстрее, чем фильтры. –

+0

Здравствуйте, спасибо за быстрый ответ. Я думаю, что отношения не помогут мне с этой проблемой. Если я создаю связь между этими таблицами, я буду относиться к Orders [ArticleNr] к Orderfilter [ArticleNr]. Таким образом, я бы отфильтровал таблицу Orders на основе ArticleNr. Но этого я не хочу достичь. Я хочу отфильтровать таблицу ордеров на основе OrderNr. «Каковы продажи всех заказов, содержащих статьи x, y или z?» С вашим предложением я мог бы ответить на вопрос «Каковы продажи статей x, y или z?». Или я ошибаюсь в этом предположении? –

+0

Я бы обработал его у источника, т. Е. Создав общий столбец в таблицах Заказы и Orderfilter. Измените свой вопрос, чтобы включить пример данных и ожидаемый результат. –

ответ

0

Этот подход будет работать только при выборе одного ArticleNr. Так как я использую MAX() функцию, чтобы определить, какое значение выбрано в фильтре, она вернет максимальный выбранный ArticleNr.

Рассмотрим этот пример данных:

Заказы Таблица

OrderNr ArticleNr Revenue 
    1   1  100 
    1   2  200 
    2   1   50 
    2   3   70 
    3   2  300 
    3   4  200 
    4   1   50 

Статьи

ArticleNr 
    1 
    2 
    3 

Создать меру для определения строк:

Rows := 
SUMX (FILTER (Orders, [ArticleNr] = MAX (Articles[ArticleNr])), 1) 

Теперь с помощью Rows меры вы можете получить в Sum Sales:

Sum Sales := 
SUMX (
    FILTER (Orders, SUMX (ALLEXCEPT (Orders, Orders[OrderNr]), [Rows]) = 1), 
    [Revenue] 
) 

Это сводная таблица в энергетике Pivot.

enter image description here

Позвольте мне знать, если это помогает.

+0

Привет, это отлично работает! Я поражен, сколько усилий вы потратили на этот вопрос. В конце концов, я был не очень доволен возможностью фильтровать только один ArticleNr. Я нашел другое решение, которое работает с несколькими ArticleNrs здесь: http://blog.gbrueckl.at/2012/05/resolving-many-to-many-relationships-leveraging-dax-cross-table-filtering/ –

0

Если это слишком медленно, когда вы используете иерархии в Excel, то проблема в иерархиях. Наверное, это неестественно. Excel отправляет запросы MDX в SSAS независимо от того, какой движок используется (табличный/многодиальный). И когда дело доходит до неестественных иерархий, все идет не так.

Постарайтесь создать естественную иерархию и тогда ее проверить. В качестве примера возьмем Date Date. У вас есть дата, месяц, год. Если вы просто поместите январь-декабрь в столбец Month, он не будет уникальным. Попробуйте явно указать членов hierarhy. Как и в этом случае, введите год в столбцы месяца, например, январь-2016 и т. Д. Поэтому каждый месяц будет уникальным, и движок не будет принимать какой-либо член, когда вы делаете разворот.