在PowerBI中如何计算列值?多对一关系表计算列需求
表关联计算列需求及解决方案
表结构与示例数据
Table1(多端表)
ID Name Country -------------------- 1 Aaa IND 1 Aaa USA 2 Bbb FRA 3 Ccc BEL 3 Ccc BEN 3 Ccc ARE 3 Ccc AUS
Table2(单端表)
ID Name Country col1 col2 ------------------------------------- 1 Aaa IND TRUE TRUE 1 Aaa All FALSE TRUE 2 Baa FRA FALSE TRUE 2 Baa All FALSE TRUE 3 Ccc BEL TRUE TRUE 3 Ccc AUS TRUE FALSE 3 Ccc All TRUE TRUE
期望输出
需在Table1中新增T、F计算列,结果如下:
ID Name Country T F -------------------------------------- 1 Aaa IND FALSE TRUE 1 Aaa USA FALSE TRUE 2 Bbb FRA FALSE TRUE 3 Ccc BEL TRUE TRUE 3 Ccc BEN TRUE TRUE 3 Ccc ARE TRUE TRUE 3 Ccc AUS TRUE TRUE
规则说明
- Table1与Table2为**多(Table1)对一(Table2)**关系,按
ID关联 - 若Table2中存在当前
ID对应的Country='All'行,则该行的col1、col2值直接填充到Table1对应ID的所有行的T、F列 - 若Table2中无当前
ID的Country='All'行,则匹配Table1的Country与Table2的Country,取对应col1、col2值填充
解决方案(SQL实现)
核心思路:先提取Table2中所有Country='All'的行作为基准值表,再将其与Table1关联,优先使用基准值,无基准值时再匹配对应国家的行数据。
WITH table2_all_values AS ( -- 提取每个ID对应的All行的col1、col2值 SELECT ID, col1 AS T_value, col2 AS F_value FROM Table2 WHERE Country = 'All' ) SELECT t1.ID, t1.Name, t1.Country, -- 优先用All行的值,没有则取对应国家的col1 COALESCE(tav.T_value, t2.col1) AS T, -- 优先用All行的值,没有则取对应国家的col2 COALESCE(tav.F_value, t2.col2) AS F FROM Table1 t1 -- 关联All行基准值表 LEFT JOIN table2_all_values tav ON t1.ID = tav.ID -- 关联对应国家的Table2行(仅当无All行时生效) LEFT JOIN Table2 t2 ON t1.ID = t2.ID AND t1.Country = t2.Country;
逻辑解释
- CTE子查询:先筛选出Table2中所有
Country='All'的记录,按ID提取col1和col2作为全局基准值 - 左连接基准值表:确保每个Table1的行都能匹配到对应
ID的基准值(如果存在) - COALESCE函数:实现优先级判断,优先使用基准值,当基准值不存在时,再匹配对应国家的Table2行数据
内容的提问来源于stack exchange,提问作者Chinmay Gaikwad
相关产品推荐
相关产品推荐

