DAX实现带过滤多表关联:复现Power BI Report Builder可用的SQL查询
前置操作
- 先确认Power BI数据模型中3张表的关联关系:CustomCar表[CarId]作为主键,分别和Chassis表[CarId]、Engine表[CarId]建立一对多的单方向关联,不需要启用双向交叉筛选。
可用DAX语句(可直接在Power BI Report Builder数据集里调用,也可作为Power BI模型中的计算表使用)
车辆当前配置列表 = FILTER( SELECTCOLUMNS( // 筛选符合条件的CustomCar记录,等效SQL中CustomCars表的where条件 FILTER( CustomCar, CustomCar[IsActive] = 1 && CustomCar[FirstTestDriveYear] < 1980 ), // 提取CustomCar所需字段 "Name", CustomCar[Name], "CustomCarModel", CustomCar[Model], "MaxSpeed", CustomCar[MaxSpeed], // 关联提取当前激活的底盘字段 "ChassisManufacturer", CALCULATE(SELECTEDVALUE(Chassis[Manufacturer]), Chassis[IsActive] = 1), "ChassisModel", CALCULATE(SELECTEDVALUE(Chassis[Model]), Chassis[IsActive] = 1), "ChassisManfDate", CALCULATE(SELECTEDVALUE(Chassis[ManufacturedDate]), Chassis[IsActive] = 1), // 关联提取当前激活的发动机字段 "EngineManufacturer", CALCULATE(SELECTEDVALUE(Engine[Manufacturer]), Engine[IsActive] = 1), "EngineModel", CALCULATE(SELECTEDVALUE(Engine[Model]), Engine[IsActive] = 1), "Power", CALCULATE(SELECTEDVALUE(Engine[Power]), Engine[IsActive] = 1), "CylCount", CALCULATE(SELECTEDVALUE(Engine[CylCount]), Engine[IsActive] = 1), "EngineManufacturedDate", CALCULATE(SELECTEDVALUE(Engine[ManufacturedDate]), Engine[IsActive] = 1) ), // 过滤无对应激活底盘/发动机的记录,等效SQL的INNER JOIN逻辑 NOT ISBLANK([ChassisManufacturer]) && NOT ISBLANK([EngineManufacturer]) )
逻辑说明
- 因为业务规则保证同一时间每辆车只有1个激活状态的底盘、发动机,所以用
SELECTEDVALUE可以直接返回匹配到的唯一值,不需要额外聚合 - 所有输出字段别名和原SQL完全对齐,不需要额外调整即可直接用于报表设计
- 基于你提供的样例数据,运行后仅会返回CarId=2的CustomBranco车辆对应记录,和原SQL运行结果完全一致
内容的提问来源于stack exchange,提问作者AleX_
相关产品推荐
相关产品推荐

