首页 > 解决方案 > 如何在不使用桥接表的情况下拥有响应切片器值的动态轴,仅使用 DAX

问题描述

仪表板图像

大家好,我有一张图表,我需要通过更改切片器值来更改 x 值(轴)(此切片器是黄色的,具有所有 Dims(x 值)),它来自DimList表格。例如,目前图表是totalfreightby custid,但如果我empid从黄色切片器检查图表值更改为totalfreightby ,我需要empid。这发生在所有切片器值上。

但我不喜欢桥接表或任何对性能有不良影响的方法,因为它FactTable有十亿行,我在 SSAS、表格模型中对其进行建模并具有实时连接。提前致谢。

标签: powerbidaxdashboard

解决方案


我假设您指的是使用本文中描述的桥接表的方法。我同意鉴于模型中的数据量,您可能会面临一些性能问题。

首先,您应该尝试查看是否有其他 Power BI 前端功能可以直接在报表中使用,而无需更改数据模型。也许您可以使用 Power BI 书签、链接或自定义视觉对象?

如果没有,您可以在数据模型中使用另一种方法,它不依赖于桥接表。免责声明:我没有对此进行测试 - 可能涉及其他性能问题。

  1. 用您的各个维度中的所有成员构建一个新维度表。IE。创建所有 EmpID、CustID 等的联合。确保在单独的列中指明 ID 的类型。该表应如下所示:

    DimensionId MemberId
    categoryid  1
    categoryid  2
    categoryid  3
    custid      1
    custid      2
    custid      3
    ...
    

    让我们将此表命名为“所有维度”。该表不应与其他表有任何关系(这类似于参数表模式

  2. 每当在“所有维度”表上选择某些内容时,更改您的度量以应用虚拟关系,以正确过滤事实表:

    SUM('factSale'[Freight])
    

    会成为:

    SWITCH(
        SELECTEDVALUE('All Dimensions'[DimensionId]),
        "categoryid", CALCULATE(SUM('factSale'[Freight]), 
            KEEPFILTERS(TREATAS(VALUES('All Dimensions'[MemberId]), 'factSale'[CategoryId])),
        "custid", CALCULATE(SUM('factSale'[Freight]), 
            KEEPFILTERS(TREATAS(VALUES('All Dimensions'[MemberId]), 'factSale'[CustId])),
        "empid", CALCULATE(SUM('factSale'[Freight]), 
            KEEPFILTERS(TREATAS(VALUES('All Dimensions'[MemberId]), 'factSale'[EmpId])),
        // ... etc. for all dimensions ...
        , // Fallback, when nothing is selected on 'All Dimensions'
        IF(NOT ISFILTERED('All Dimensions'[MemberId]), 
            SUM('factSale'[Freight])
        )
    )
    
    1. 将 [DimensionId] 列放入切片器并使用 [MemberId] 列作为条形图上的轴。请注意,图表不会显示任何内容,除非在 [DimensionId] 切片器上过滤了一个项目。

说明:SWITCH语句确定是否对“所有维度”表的 [DimensionId] 列进行了任何选择。TREATAS在这种情况下,使用该函数将过滤器应用于事实表,具体取决于已选择的维度。我们使用 KEEPFILTERS 来确保直接在各个维度上制作的任何现有过滤器都保持原样。

如果没有在 [DimensionId] 列上进行选择,我们希望回退到标准度量SUM('factSale'[Freight]),但由于我们不想对 [MemberId] 列上的所有项目重复此度量,我们使用IF(NOT ISFILTERED( ...来确保如果当前在图表轴上使用 [MemberId],我们只返回一个空白值。


推荐阅读