我有两个表(Sales [OrderNumer,Price,ItemId,...]和Item [Id,名称,类型]),并且我有一个返回这样的字符串的度量:
ItemsType1 = CALCULATE(
CONCATENATEX('Sales', RELATED('Item'[Name]), ","), 'Item'[Type] = "type1"
在Power BI Desktop中,我在订单级别有一个表格,度量为ItemsType1 [OrderNumer,ItemsType1]。我想通过“ n / a”之类的默认值更改ItemType1列的BLANK值,并将度量重写为:
ItemsType1 = VAR x = CALCULATE(
CONCATENATEX('Sales', RELATED('Item'[Name]), ","), 'Item'[Type] = "type1")
RETURN IF( ISBLANK(x), "n/a", x )
该度量返回期望值,但是通过这种方式,对于Sales
表中我的600000行,内存突然增长并且视觉崩溃。我有16GB的内存。我认为问题出在IF语句上,但我不知道为什么。我想了解为什么这种性能差异以及实现此目的的最佳方法是什么。
答案 0 :(得分:0)
我很确定它之所以会崩溃,是因为由于您编写的方式,它将为表中的 ALL 可能的所有内容返回type1
,而不仅仅是IF
个您要过滤的内容。
解决方案是在串联中移动ItemsType1 =
CALCULATE (
CONCATENATEX ( 'Sales',
IF(ISBLANK( RELATED ( 'Item'[Name] ) )
"n/a",
RELATED ( 'Item'[Name] )
),
"," ),
'Item'[Type] = "type1"
)
。尝试这样的事情:
RETURN
以上内容与我的预期不符。尝试改为将您的RETURN
IF(
COUNTROWS( RELATEDTABLE( 'Item' ) ) = 0,
BLANK(),
IF( ISBLANK( x ), "n/a", x )
)
行更改为此:
Dim arr() As String
lrn = 13237 'ActiveSheet.Range("A1").Range("A1").SpecialCells(xlCellTypeLastCell).Row
ac = 0
ReDim arr(0 To ac) As String
For Each c In Range("L2:L" & lrn)
If Not IsEmpty(c.Value) Then
If Not (UBound(Filter(arr, c.Value)) > -1) Then
If ac > 0 Then ReDim Preserve arr(0 To ac)
arr(ac) = c.Value
ac = ac + 1
End If
End If
DoEvents
Next c
这会在进行任何较大的计算之前检查任何空的相关表。