DAX,无论日期行上下文如何,都能获得销售增长的最后一个日期

时间:2020-04-08 10:42:47

标签: powerbi dax powerbi-desktop

如何获取带有销售金额的最小和最大日期之间所有日期的带有销售金额的最新日期。在表格中,某些日期可能具有空值。这是预期结果的示例:

enter image description here

这是我尝试过的。这些都是DAX措施。

LastDate = 
CALCULATE( 
    LASTDATE( Sales[Date] ), 
    REMOVEFILTERS( Sales[Date] ) 
)
LastNonBlank = 
CALCULATE( 
    LASTNONBLANK( Sales[Date], [Sales] ),
    REMOVEFILTERS( Sales )
)
MaxDate = 
CALCULATE( 
    MAX( Sales[Date] ), 
    REMOVEFILTERS( Sales[Date] ) 
)
MaxDate_Filter = 
CALCULATE( 
    MAX( Sales[Date] ),
    FILTER( ALL( Sales ), Sales[Amount] > 0 )
)

这就是我得到的:

enter image description here

因此,所有措施均未取得预期结果。

重新创建问题的表:

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMjIwMtA1MAQiJR0lEIYLmCjF6iDJGwHl8EgbA+VM8cibAOWM8cibQoxXio0FAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [Date = _t, Amount = _t, #"Expected Result" = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Date", type date}, {"Amount", Int64.Type}, {"Expected Result", type date}})
in
    #"Changed Type"

更新

在这里我找到了解决我的问题的有趣参考:

https://www.sqlbi.com/articles/hiding-future-dates-for-calculations-in-dax/

我们将计算列添加到“销售”表中:

DatesWithSales = 
var CalendarDate = Sales[Date]
return
CalendarDate <= CALCULATE( MAX( Sales[Date] ), FILTER( ALLSELECTED( Sales ), Sales[Amount] > 0 ) ) &&
CalendarDate >= CALCULATE( MIN( Sales[Date] ), FILTER( ALLSELECTED( Sales ), Sales[Amount] > 0 ) )

然后我们使用度量:

Expected Result = 
CALCULATE(
    MAX( Sales[Date] ),
    CALCULATETABLE(
        VALUES( Sales[Date] ), -- here can be whatever time intelligence function like SAMEPERIODLASTYEAR( Sales[Date] )
        Sales[DatesWithSales] = TRUE()
    )
)

3 个答案:

答案 0 :(得分:2)

您可以尝试:

    Expected Result = 
var maxDate = CALCULATE(MAX(Sales[Date]), FILTER(Sales, NOT(ISBLANK(Sales[Amount]))))
return IF(Sales[Date]> maxDate,BLANK(),maxDate)

仅当Sales [Date]小于或等于此值时,它才会首先基于所有行中的Amount值计算maxDate,然后使用maxDate填充列。

答案 1 :(得分:2)

您的MaxDate_Filter看起来不错。如果您要删除超出此日期的日期,则可以

Expected Result =
VAR RowDate = SELECTEDVALUE ( Sales[Date] )
RETURN
    IF ( RowDate <= [MaxDate_Filter], RowDate )

,或者,假设您已经定义了类似的[MinDate_Filter],并且希望在两侧进行过滤:

Expected Result =
VAR RowDate = SELECTEDVALUE ( Sales[Date] )
RETURN
    IF ( RowDate <= [MaxDate_Filter] && RowDate >= [MinDate_Filter], RowDate )

答案 2 :(得分:1)

在这里我找到了解决问题的有趣参考:

https://www.sqlbi.com/articles/hiding-future-dates-for-calculations-in-dax/

我们将计算列添加到“销售”表中。在实际模型中,应将此列添加到“日历”表中。

DatesWithSales = 
var CalendarDate = Sales[Date]
return
CalendarDate <= CALCULATE( MAX( Sales[Date] ), FILTER( ALLSELECTED( Sales ), Sales[Amount] > 0 ) ) &&
CalendarDate >= CALCULATE( MIN( Sales[Date] ), FILTER( ALLSELECTED( Sales ), Sales[Amount] > 0 ) )

然后我们使用度量:

Expected Result = 
CALCULATE(
    MAX( Sales[Date] ),
    CALCULATETABLE(
        VALUES( Sales[Date] ), -- here can be whatever time intelligence function like SAMEPERIODLASTYEAR( Sales[Date] )
        Sales[DatesWithSales] = TRUE()
    )
)
相关问题