在DAX中对笛卡尔积的计算列进行过滤

时间:2019-10-30 14:36:03

标签: powerbi dax slicers

我需要一个切片器来仅勾选那些预算目标值的产品和区域。 enter image description here

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

此处的绿色表格是一列所有值的维桥。红色表格是产品和品牌的笛卡尔乘积,具有计算得出的目标。

enter image description here

这是我煮过的红色餐桌的DAX代码,可以解决此问题。

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

该表显示如下: enter image description here

但是,如此巧妙地获得的列IsTarget不会通过切片器影响我的视觉效果。如何解决。

文件PBIX在这里。

在评论后进行编辑。 enter image description here 亚历克西斯,这是你的意思吗?我添加了列P @ R,这是产品和地区的串联。似乎有效:-)

1 个答案:

答案 0 :(得分:1)

这就是我的建议,最下面的关系在Index列上。

Relationship Diagram

为此,我的#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])
    )

(注意:由于我没有使用您原来的关系,因此过滤必须明确。)

从那里我通过查找将索引移至FactTableSalesBudget

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

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