如果我们需要通过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,但是当我应用其他属性切片器时,它在报表中不起作用。可能是我缺少什么吗? 寻找优化的解决方案。预先非常感谢。
答案 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))
尽管如此,它们仍应比原始公式更快。