Google Sheets中按行去重统计字符串出现次数的公式问题
解决Google Sheets中按教师统计唯一学生的问题
首先明确你的核心需求:统计每个教师对应的唯一学生数量,要排除同一学生行内重复出现的教师记录(比如Lin的B和D列都是教师1,只能算1次,所以教师1的正确统计是3,而非4)。
你的Excel公式在Google Sheets失效的原因是:OFFSET函数在两个工具中的数组行为不一致——Excel会把OFFSET(B$2:D$2, ROW($2:$4)-1, 0)解析为包含每行B-D区域的数组,但Google Sheets不会自动生成多区域数组,只会返回单个区域,导致后续的COUNTIF无法正确遍历每行数据。
下面给你几个适配Google Sheets的高效解决方案:
方案1:直观的逐行检查法(适合新手)
把这个公式放在F5(对应E5的教师编号):
=COUNTA(BYROW(B2:D4, LAMBDA(row, IF(COUNTIF(row, E5)>0, 1, ""))))
工作原理:
BYROW(B2:D4, LAMBDA(row, ...)):逐个遍历每行(每个学生的教师记录)IF(COUNTIF(row, E5)>0, 1, ""):如果当前学生的记录里有目标教师,就标记为1,否则留空COUNTA:统计标记为1的行数,也就是有多少个学生至少和该教师见过一次(自动跳过行内重复的教师记录)
方案2:更简洁的SUMPRODUCT版本
如果喜欢用SUMPRODUCT风格的公式,这个更紧凑:
=SUMPRODUCT(--(BYROW(B2:D4, LAMBDA(r, COUNTIF(UNIQUE(r), E5)>0))))
工作原理:
UNIQUE(r):先对当前行的教师记录去重(去掉同一学生重复的教师)COUNTIF(UNIQUE(r), E5)>0:检查去重后的记录里是否有目标教师,返回TRUE/FALSE--:把布尔值转换为1/0SUMPRODUCT:求和得到最终的唯一学生数量
方案3:批量统计所有教师(高效进阶)
如果需要一次性统计所有教师的学生数量,而不是单个查询,用QUERY函数更高效:
=QUERY( FLATTEN(BYROW(B2:D4, LAMBDA(r, TEXTJOIN(",", TRUE, UNIQUE(r))))), "SELECT Col1, COUNT(Col1) WHERE Col1 IS NOT NULL GROUP BY Col1 LABEL Col1 '教师编号', COUNT(Col1) '学生数量'" )
工作原理:
- 先对每行的教师记录去重,转成逗号分隔的字符串
FLATTEN把所有字符串拆成单个教师编号的列表(每个学生对应其所有不重复的教师)QUERY分组统计每个教师对应的学生总数,直接生成统计表格
内容的提问来源于stack exchange,提问作者W Lee
相关产品推荐
相关产品推荐

