首页 > 解决方案 > 在 DAX 中过滤笛卡尔积的计算列

问题描述

我需要一个切片器来仅勾选那些具有预算目标的产品和区域。 在此处输入图像描述

我的数据模型比我在这里展示的要复杂一些。在我的真实场景表中,预算不存在,目标值必须从其他不同粒度的表中计算出来。假设我们不能在预算表上使用计算列。

这里的绿色表格是一列全值维度的桥梁。红色表格是具有计算目标的产品和品牌的笛卡尔积。

在此处输入图像描述

这是我为解决问题而制作的红色表格的 DAX 代码。

#Brand x Region =
ADDCOLUMNS (
    CROSSJOIN ( '#product', '#region' ),
    "Target", CALCULATE ( SUM ( Budget[target] ) ),
    "IsTarget", IF ( CALCULATE ( SUM ( Budget[target] ) ) > 0, "Yes", "No" )
)

该表显示如下: 在此处输入图像描述

但是这种巧妙获得的列 IsTarget 并不会影响我通过切片器的视觉效果。如何修复它。

在此处归档PBIX

评论后编辑。 在此处输入图像描述 亚历克西斯,这就是你的意思吗?我添加了列 P@R,它是产品和区域的串联。它似乎工作:-)

标签: powerbidaxslicers

解决方案


这就是我的建议,底部关系位于Index列上。

关系图

为了做到这一点,我的#Brand x Region桌子是这样的:

#Brand x Region = 
VAR CrossProduct =
    ADDCOLUMNS (
        CROSSJOIN ( '#product', '#region' ),
        "Target",
        CALCULATE (
            SUM ( Budget[target] ),
            FILTER (
                Budget,
                Budget[product] = EARLIER ( '#product'[product] ) &&
                Budget[region] = EARLIER ( '#region'[region] )
            )
        )
    )
RETURN
    ADDCOLUMNS(
        CrossProduct,
        "IsTarget", IF ( [Target] > 0, "Yes", "No" ),
        "Index", RANKX(CrossProduct, '#product'[product] & '#region'[region])
    )

(注意:过滤必须是明确的,因为我没有使用您最初拥有的关系。)

从那里我将索引拉到FactTableSalesandBudget并进行查找:

Index =
LOOKUPVALUE (
    '#Brand x Region'[Index],
    '#Brand x Region'[product], [product],
    '#Brand x Region'[region], [region]
)

请注意,在查询编辑器中创建索引列通常比尝试在 DAX 中更容易,但您无法在查询编辑器中修改计算表。


推荐阅读