DAX函数根据ID和日期计算平均值

时间:2020-10-21 16:47:17

标签: powerbi dax

我正在尝试根据日期和更改标志来计算3个月的平均值。 例如,我有以下列:

日期-ID项目-说明-销售额-更改(名称更改时显示1)

可以考虑更改列和日期来计算平均值,例如,产品名称在2019年5月进行了更改,因此我希望在5月之后的3个月和5月之前的3个月获得平均值。

该图显示了我正在使用的表:

enter image description here

1 个答案:

答案 0 :(得分:0)

如果我理解您的要求正确,请按照以下步骤操作,将您带到所需的输出-

步骤1 转到 Power Query Editor 并创建以下3个自定义列-

start date before = Date.AddMonths([date],-2)
end date after = Date.AddMonths([date],3)
在创建两个自定义列后,

将数据类型更改为日期,然后点击关闭并应用按钮返回报表。

第2步在表格中的2 测量下创建这些内容。我认为表格名称为 your_table_name (调整您自己)

3_month_average_before = 

VAR current_row_chaneg = MIN(your_table_name[change])
VAR current_row_start_date_before = MIN(your_table_name[start date before])
VAR current_row_date = MIN(your_table_name[date])
VAR current_row_desc = MIN(your_table_name[desc.])

RETURN
IF(
    current_row_chaneg <> 1,
    BLANK(),
    CALCULATE(
        SUM(your_table_name[sales]),
        FILTER(
            ALL(your_table_name),
            your_table_name[date] >= current_row_start_date_before
            && your_table_name[date] <= current_row_date
            && your_table_name[desc.] <> current_row_desc //--considered different product name for previous 3 month average
        )
    )
)
3_month_average_after = 

VAR current_row_chaneg = MIN(your_table_name[change])
VAR current_row_end_date_after = MIN(your_table_name[end date after])
VAR current_row_date = MIN(your_table_name[date])
VAR current_row_desc = MIN(your_table_name[desc.])

RETURN
IF(
    current_row_chaneg <> 1,
    BLANK(),
    CALCULATE(
        SUM(your_table_name[sales]),
        FILTER(
            ALL(your_table_name),
            your_table_name[date] <= current_row_end_date_after
            && your_table_name[date] > current_row_date
            && your_table_name[desc.] = current_row_desc //--considered same product name for after 3 month average
        )
    )
)

我根据自己的理解运用了逻辑。如果需要,可以在同一过程中调整逻辑。下面是给定样本数据的样本输出-

enter image description here

列代码

change = 

VAR current_id  = your_table_name[id item]
VAR current_desc  = your_table_name[desc.]
VAR current_date  = your_table_name[date]

VAR current_item_count = 
CALCULATE(
    COUNTROWS(your_table_name),
    FILTER(
        ALL(your_table_name),
        your_table_name[id item] = current_id
        && your_table_name[desc.] = current_desc
        && your_table_name[date] <=current_date
    )
)

VAR previous_item_count = 
CALCULATE(
    COUNTROWS(your_table_name),
    FILTER(
        ALL(your_table_name),
        your_table_name[id item] = current_id
        && your_table_name[date] <= current_date
        && your_table_name[desc.] <> current_desc
    )
)

RETURN IF(current_item_count = 1 && previous_item_count <> 0 , 1, 0)