在 DAX 中,如何使用 TOPN 但仍然是 SLICER-RESPONSIVE 度量(如 KEEPFILTERS)

问题描述 投票:0回答:1

我在此 Power BI 项目中创建了多个可视化效果,由成功过滤响应的 DAX 度量驱动:当我在表中的某些列上使用筛选器(或切片器)时,所有可视化效果都会发生变化。

通过确保所有需要的数据表包含某些标志,然后为每个标志创建一个“驱动程序表”来创建过滤器响应性。 然后我为每个标志在标志的驱动程序表和每个数据表之间创建了一个“关系”。

这样,当我为该标志定义“所有页面”过滤器时,我使过滤器选择“FROM THE DRIVER-TABLE”。 因此,该标志选择会选择所有数据表,影响其所有度量,从而更改其所有可视化。

但是......这对于我的“最后 10 个”可视化效果不起作用。 问题是:我被要求排除计数为零的行。

我尝试使用 Power BI 筛选功能,按 TOP N 进行筛选,但随后选择了零计数行。

我尝试在 DAX 中使用 TOPN 作为表,但问题是它不是过滤器响应式的:KEEPFILTERS 似乎没有完成其工作。

这是我使用 TOPN 制作的通用代码示例,就像我尝试过的那样:

TopN_table = 
    TOPN(5, 
        SUMMARIZE(
            FILTER(
                KEEPFILTERS('my_detail_data')
                , 'my_detail_data'[flag_a_4_member] = "Y" 
                && 'my_detail_data'[flag_b_4_line] = "Y"
            ),
            'my_detail_data'[text_col_to_group_1],
            'my_detail_data'[text_col_to_group_2],
            "summ_col_1", SUM('my_detail_data'[int_col_1]),
            "summ_col_2", SUM('my_detail_data'[int_col_2])
        ),
        [summ_col_1], DESC,
        [summ_col_2], DESC
    )

我还尝试了一种变体,其中 DAX 表不执行 TOPN,而只是执行基本过滤和排除零计数,但同样...... KEEPFILTERS 似乎不起作用:它不是过滤器-有反应。

这是一个类似该代码的示例,它几乎完成所有操作,将 TOPN 留给过滤器:

DaxTbl_2 = 
  VAR temp_table = 
    FILTER(KEEPFILTERS(
        SUMMARIZE(
            FILTER(KEEPFILTERS('my_detail_data')
                , 'my_detail_data'[flag_a_4_member] = "Y" 
                && 'my_detail_data'[flag_b_4_line] = "Y"),
            'my_detail_data'[text_col_to_group_1],
            'my_detail_data'[text_col_to_group_2],
            "summ_col_1", SUM('my_detail_data'[int_col_1]),
            "summ_col_2", SUM('my_detail_data'[int_col_2])
        )), 
        [summ_col_1] > 0
    )
RETURN 
    temp_table

我猜测缺乏过滤响应是因为 SUMMARIZE 不包含标志列。 但是这些标志要在详细级别(在上面的伪代码中,在 [int_col_1] 和 [int_col_2] 级别)选择,而我需要在组级别([summ_col_1])排除零计数。

建议?

filter powerbi dax greatest-n-per-group
1个回答
0
投票

我同意使用计算表并不是解决这个问题的正确方法。我建议使用表格上的一系列度量:度量将根据所选的切片器自动更新。

以下是我建议采取的步骤的摘要:

  1. int_col_1
    int_col_2
    创建求和措施。
  2. int_col_1
    int_col_2
    创建排名衡量标准。
  3. 创建总体排名衡量标准。
  4. 将总体排名添加到表格中,并按总体排名指标中的前 5 名过滤表格。
  5. 通过选择切片器并查看桌子如何调整来进行测试。

1 为

int_col_1
int_col_2
创建求和措施。

sumCol1 = SUM(my_detail_data[int_col_1])
sumCol2 = SUM(my_detail_data[int_col_2])

2 为

int_col_1
int_col_2
创建排名衡量标准。

col1Rank =
RANKX (
    ALLSELECTED (
        my_detail_data[text_col_to_group_1],
        my_detail_data[text_col_to_group_2]
    ),
    [sumCol1],
    ,
    DESC,
    DENSE
)
col2Rank =
DIVIDE (
    RANKX (
        ALLSELECTED (
            my_detail_data[text_col_to_group_1],
            my_detail_data[text_col_to_group_2]
        ),
        [sumCol2],
        ,
        DESC,
        DENSE
    ),
    COUNTROWS ( ALL ( my_detail_data ) )
)

确保两者都是

Decimal number
格式并保留两位小数

3 创建总体排名衡量标准。

FinalRank =
RANKX (
    ALLSELECTED (
        my_detail_data[text_col_to_group_1],
        my_detail_data[text_col_to_group_2]
    ),
    [col1Rank] + [col2Rank],
    ,
    ASC,
    DENSE
)

4 将总体排名添加到表格中,并按总体排名指标中的前 5 名过滤表格。

finalrank

5 通过选择切片机并查看桌子如何调整来进行测试。

filtered example

左边是原表,右边是排名表


此答案使用的模拟数据:

text_col_to_group_1 text_col_to_group_2 flag_a_4_member flag_b_4_line int_col_1 int_col_2
A组 类型1 100 200
A组 类型2 N 150 100
B组 类型1 N 120 80
B组 类型2 200 50
C组 类型1 90 30
C组 类型2 N N 50 60
D组 类型1 180 110
D组 类型2 N 140 90
E组 类型1 170 220
E组 类型2 N 60 70
A组 类型1 300 500
A组 类型2 N 250 150
B组 类型1 N 320 180
B组 类型2 400 250
C组 类型1 190 130
C组 类型2 N N 150 160
D组 类型1 280 210
D组 类型2 N 240 190
E组 类型1 370 320
E组 类型2 N 160 170
© www.soinside.com 2019 - 2024. All rights reserved.