DAX默认为包含数据的最后一个值

时间:2018-02-20 00:01:07

标签: dax dimensional-modeling azure-analysis-services

目前我的数据返回:

enter image description here

我需要做的是,如果当前月份为0,则默认为数据的最后几个月值:

enter image description here

我知道这可以通过嵌套的IF语句完成,但是有更好的方法吗?

更新@TPD建议

@TPD建议产生的结果:

enter image description here

将度量定义为:

 IF([Land Dev Alloc] = 0, CALCULATE([Land Dev Alloc],TOPN(1, CALCULATETABLE(Hyperion,FILTER(ALL(Hyperion), [Land Dev Alloc]>0)),Hyperion[DimDateID],DESC)),[Land Dev Alloc])

其中Hyperion是衡量Land Dev Alloc来自

的主要事实表

2 个答案:

答案 0 :(得分:1)

我不确定这是不是最好的方法,但我最近解决了类似这样的问题,假设你有一个Date表和一个与关系结合的Value表:

CurrentOrLastValue:=
CALCULATE (

    -- EXTRACT VALUE FROM ROW
    FIRSTNONBLANK( 'value'[value], 1 ),

    -- FIRST ROW FROM YOUR 'VALUES' TABLE REDUCED TO THOSE BEFORE THE CURRENT CELL DATE
    -- ORDERED BY DATE DESC
    TOPN (
        1,
        CALCULATETABLE (
            'value',
            FILTER
            ( 
                ALL( 'date'[date] ), 
                'date'[date] <= MAX( 'date'[date] )
            )
        ),
        'value'[date],
        DESC
    )
)

数据表和数据透视表

Data tables and Pivot Table

<强>测量

Measure

<强>关系

Relationships

更新显示测量结果不是原始价值

添加新的核心指标(加倍值以显示差异):

TotalValue:=SUM('value'[value]) * 2

添加新度量以显示所需的输出:

CurrentOrLastValueMeasure:=CALCULATE (
    [TotalValue],
    TOPN(
        1,
        CALCULATETABLE(
            'value',
            FILTER(
                ALL( 'date'[date] ),
                'date'[date] <= MAX( 'date'[date] )
            )
        ),
        'value'[date],
        DESC
    )
)

数据透视表中的新措施:

enter image description here

在测量返回零时显示最后的非零值

LastNonZeroMeasure:=
IF( [TotalValue] = 0,
    CALCULATE (
        [TotalValue],
        TOPN(
            1,
            CALCULATETABLE(
                'value',
                FILTER(
                    ALL( 'value' ),
                    [TotalValue] > 0
                )
            ),
            'value'[date],
            DESC
        )
    ),
    [TotalValue]
)

TotalValue不再加倍。 1月4日的两个数据点显示该度量的聚合工作。

last non zero measure

更新到无法过期的无聊日期

尝试过滤日期......

LastNonZeroMeasure:=IF( [TotalValue] = 0,
    CALCULATE (
        [TotalValue],
        TOPN(
            1,
            CALCULATETABLE(
                'value',
                FILTER(
                    ALL( 'value' ),
                    [TotalValue] > 0
                ),
                FILTER(
                    ALL( 'date' ),
                    'date'[date] < max( 'date'[date] )
                )
            ),
            'value'[date],
            DESC
        )
    ),
    [TotalValue]
)

enter image description here

答案 1 :(得分:0)

结束比原先想象的要简单得多:

MeasureOne BALANCE YTD:= VAR LastNoneblankDate = CALCULATE(max('Date'[DimDateID]),FILTER(ALL('Date'),'Date'[Fiscal_Year] = MAX('Date'[Fiscal_Year])),FILTER(ALL(FactTable),[MeasureOne] > 0)) return IF([MeasureOne]=0, CALCULATE([MeasureOne],FILTER(ALL('Date'),'Date'[DimDateID] = LastNoneblankDate)), [MeasureOne BASE]) 

MeasureOne Base:

MeasureOne BASE:= VAR LastNoneblankDate = CALCULATE(max('Date'[Date]),FILTER(ALL(FactTable),[MeasureOne] > 0)) return IF(HASONEVALUE('Date'[Date]),[MeasureOne], CALCULATE([MeasureOne],FILTER(ALL('Date'),'Date'[Date] = LastNoneblankDate)))

主要问题是设置ALL(FactTable)而不是jut FactTable并使用

处理案例