如何编写优化的DAX度量以按属性按两组汇总值

时间:2019-03-23 21:45:10

标签: performance ssas powerbi dax summarize

如果我们需要通过DAX中的两个属性聚合(总和)值组,该怎么办。我用Summarize函数编写了以下度量,但是它很慢。

Reorder :=
SUMX (
    SUMMARIZE (
        TableA,
        TableA[ProdID],
        TableA[CustID],
        "ReordersCount",
        VAR VarInvoiceCount =
            SUM ( TableA[InvoiceCount] )
        RETURN
            IF ( VarInvoiceCount > 0, VarInvoiceCount - 1, 0 )
    ),
    [ReordersCount]
) 

我还寻找了SummarizeColumns,但是当我应用其他属性切片器时,它在报表中不起作用。可能是我缺少什么吗? 寻找优化的解决方案。预先非常感谢。

1 个答案:

答案 0 :(得分:1)

请考虑以下方法:

首先,为发票总数创建度量:

 总发票数= SUM(TableA [InvoiceCount])
 

第二,创建一个度量以计算许多首次发票,这些度量只是表中许多独特的产品-客户组合:

 第一张发票数=
COUNTROWS(汇总(TableA,TableA [CustID],TableA [ProdID])
 

最后,所需的结果仅仅是这两个度量的差异:

 再订货数= [总发票数]-[第一张发票数]
 

该公式将正确响应所有切片器和过滤器,并且应该非常快,因为没有嵌套的迭代循环,例如SUMX(SUMMARIZE()),没有上下文转换,也没有使用IF引起的循环内的回调语句(这是一个高级话题)。

当然,您可以使用变量将所有内容放在一起:

 再订货数=
VAR Total_Invoice_Count = SUM(TableA [InvoiceCount])
VAR First_Invoice_Count = COUNTROWS(汇总(TableA,TableA [CustID],TableA [ProdID]))
VAR Reorder_Count = Total_Invoice_Count-First_Invoice_Count
RETURN Reorder_Count
 

尽管我个人比较喜欢分解度量,因为各个度量更易于理解和调试,并且它们可能有自己的用途。

以上方法非常有效,但是它假定TableA仅包含有效订单。如果它还有取消,退货等,可能有零个或负的发票计数,那么您将不得不使用效率较低的方法,例如:

 再订货数=
SUMX(
    汇总(TableA,TableA [CustID],TableA [ProdID]),
    VAR Reorder_Count = CALCULATE(SUM(TableA [Invoice]))-1
    返回
        IF(Reorder_Count> 0,Reorder_Count,0)
)
 

或:

 再订货数=
SUMX(
    汇总(TableA,TableA [CustID],TableA [ProdID]),
    MAX(CALCULATE(SUM(TableA [Invoice]))-1,0))
 

尽管如此,它们仍应比原始公式更快。