Power BI中结合SEARCH与COUNTROWS实现学生班级数量统计
解决DAX中从逗号分隔学生列统计班级参与数量的问题
嘿,我完全懂你那种手动建表再UNION的痛苦——太繁琐了!其实不用这么折腾,我们可以用DAX的函数组合轻松实现,既可以用更简洁的拆分+统计方法,也能满足你想要结合SEARCH和COUNTROWS的需求,下面给你两种方案:
方案一:用TEXTSPLIT快速拆分(推荐,Power BI 2022年及以后版本支持)
这种方法先把每个班级的逗号分隔学生拆成单独行,再统计数量,步骤清晰且高效:
1. 先生成学生-班级映射明细(可选中间表)
学生班级映射 = GENERATE( Table1, // 你的原始班级表 SELECTCOLUMNS( TEXTSPLIT(Table1[学生姓名], ","), // 拆分逗号分隔的姓名 "学生姓名", TRIM([Value]) // 去除姓名前后可能的空格 ) )
GENERATE会把每个班级和拆分后的每个学生一一配对,生成一条学生对应一个班级的明细行,彻底解决逗号分隔的问题。
2. 生成最终统计表Table2
基于上面的映射表,直接汇总统计:
Table2 = SUMMARIZE( '学生班级映射', '学生班级映射'[学生姓名], "参与班级数量", COUNTROWS(RELATEDTABLE('学生班级映射')) )
或者你也可以跳过中间表,一步到位:
Table2 = VAR 学生班级明细 = GENERATE( Table1, SELECTCOLUMNS(TEXTSPLIT(Table1[学生姓名], ","), "学生姓名", TRIM([Value])) ) RETURN SUMMARIZE( 学生班级明细, [学生姓名], "参与班级数量", COUNTROWS(FILTER(学生班级明细, [学生姓名] = EARLIER([学生姓名]))) )
方案二:结合SEARCH与COUNTROWS实现(兼容旧版本)
如果你的环境不支持TEXTSPLIT,那我们可以用SEARCH来检查每个学生是否出现在班级的学生列表中,再用COUNTROWS统计符合条件的班级数:
Table2 = // 第一步:先提取所有唯一的学生姓名 VAR 所有唯一学生 = DISTINCT( SELECTCOLUMNS( GENERATE( Table1, // 计算当前班级有多少个学生(逗号数量+1) ADDCOLUMNS( GENERATESERIES(1, LEN(Table1[学生姓名]) - LEN(SUBSTITUTE(Table1[学生姓名], ",", "")) + 1), "学生姓名", // 通过字符串替换拆分出每个学生姓名 TRIM(MID(SUBSTITUTE(Table1[学生姓名], ",", REPT(" ", LEN(Table1[学生姓名]))), ([Value]-1)*LEN(Table1[学生姓名])+1, LEN(Table1[学生姓名]))) ) ), "学生姓名", [学生姓名] ) ) // 第二步:对每个学生,统计包含他的班级数量 RETURN ADDCOLUMNS( 所有唯一学生, "参与班级数量", COUNTROWS( FILTER( Table1, // SEARCH返回找到的位置,找不到返回0,所以>0代表班级包含该学生 SEARCH([学生姓名], Table1[学生姓名], 1, 0) > 0 ) ) )
这里的核心逻辑是:先通过字符串操作拆分出所有唯一学生,再对每个学生遍历原始班级表,用SEARCH检查该学生是否在班级的学生列表中,最后用COUNTROWS统计符合条件的班级行数,就是这个学生参与的班级数量。
这两种方案都能帮你摆脱手动建表再UNION的繁琐操作,直接生成你需要的Table2!
内容的提问来源于stack exchange,提问作者Richard Bellis
相关产品推荐
相关产品推荐

