【问题标题】:DAX Default to last value with dataDAX 默认为数据的最后一个值
【发布时间】:2018-02-20 00:01:06
【问题描述】:

目前我的数据返回:

我需要它做的是,如果当前月份有 0,它将默认为带有数据的上个月值:

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

已更新 @TPD 建议

@TPD 建议产生的结果:

将度量定义为:

 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 从中提取的主要事实表

【问题讨论】:

  • 我猜你的日期晚于你所显示的返回该值的日期?也尝试过滤日期。答案已更新。
  • @TDP,感谢您的帮助,这比最初假设的要简单得多。查看答案
  • 我看不到答案...

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


【解决方案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
    )
)

数据表和数据透视表

测量

关系

更新以显示测量结果而非原始值

添加新的核心度量(将值加倍以显示差异):

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

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

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

数据透视表中的新度量:

更新以在测量返回零时显示最后一个非零值

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

TotalValue 不再翻倍。 1 月 4 日的两个数据点,用于显示度量的聚合工作。

更新以忽略单元格日期之前的日期

也尝试过滤日期...

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]
)

【讨论】:

  • 我正在处理一个度量,而不是表中的列
  • 您能否重新表述为引用值表中的度量而不是列?
  • 您每个月都有不同的衡量标准吗?
  • 不,只有一个度量,日期维度,跨越地平线。如何设置列引用以允许度量引用
  • 我想您需要更改度量以返回当前返回零的那些月份的值。我的回答希望能给你一个如何做的例子......
【解决方案2】:

最终比最初想象的要简单得多:

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 基地在哪里:

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 并使用

处理案例

【讨论】:

  • 您的答案引用了原始问题中未包含的代码...在我看来,您好像已经使用我的答案找到了您的解决方案。
  • 我会正确设置你的,因为我的是你发布的内容的派生,只是我使用的 EXACT 解决方案,不用担心
猜你喜欢
  • 2012-05-22
  • 2018-07-20
  • 2018-06-15
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
相关资源
最近更新 更多