在表格模型中使用DAX的自我过滤表非常慢

时间:2017-01-30 16:17:00

标签: ssas dax tabular ssas-tabular

我有一个包含订单头寸和相应订单号的事实表。它有大约250 mio行。

我的目标是创建一个可用于回答以下问题的衡量标准:包含产品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

更新:所需的结果表(真的不知道如何在这里添加表格......)

订单表。如果我过滤ArticleNr = 2,我想保留"< - Keep" -rows。

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

2 个答案:

答案 0 :(得分: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]
)

这是Power Pivot中的数据透视表。

enter image description here

如果有帮助,请告诉我。

答案 1 :(得分:0)

如果在Excel中使用层次结构时速度很慢,那么层次结构就是问题所在。可能是不自然的。无论使用何种引擎(表格/多维),Excel都会向MDAS发送MDX查询。当谈到不自然的等级时,事情就出错了。

尝试建立自然层次结构并进行检查。 以日期昏暗为例。 你有日期,月份,年份。如果您只是将1月 - 12月放入月份列,它就不会是唯一的。尝试明确指定hierarhy成员。就像在这种情况下一样,将年份列入月份列,例如2016年1月,等等。因此,每个月都将是唯一的,并且当您进行下钻时,引擎将不会选择哪个成员。