使用Google Spreadsheets,您可以编写查询。但是,如果您在引号中使用了列字母,那么它们不会随着列顺序的更改而更新。
有没有一种方法可以编写这些查询,这样就不必在每次添加或删除列时都进行更新?
是否可以在查询中使用命名范围来解决此问题?
这是一个示例:如果在“ F”之后添加一列,则列“ G”会被推送到“ H”,并且公式的含义也会改变。
= Query(B:J,“按G选择平均(J)组”)
相关问题
这个问题与使用查询使用列标题而不是列字母不同,因为这个问题集中在命名范围的使用上。
使用Google Spreadsheets,您可以编写查询。但是,如果您在引号中使用了列字母,那么它们不会随着列顺序的更改而更新。
有没有一种方法可以编写这些查询,这样就不必在每次添加或删除列时都进行更新?
是否可以在查询中使用命名范围来解决此问题?
这是一个示例:如果在“ F”之后添加一列,则列“ G”会被推送到“ H”,并且公式的含义也会改变。
= Query(B:J,“按G选择平均(J)组”)
相关问题
这个问题与使用查询使用列标题而不是列字母不同,因为这个问题集中在命名范围的使用上。
Answers:
这是一种棘手的问题,但是可以通过使用辅助范围和一些串联来实现。
需要做什么:
创建一个命名范围COLS,以携带这样的列字母:
A
B
C
D
E
...
如图所示,以垂直方式进行操作。
像这样组装查询字符串:
=QUERY( B:J, "SELECT AVG(" & INDEX(**COLS**, COLUMN(J1)) & ") GROUP BY " & INDEX(**COLS**, COLUMN(G1)) )
有没有一种方法可以编写这些查询,这样就不必在每次添加或删除列时都进行更新?
是否可以在查询中使用命名范围来解决此问题?
是的,您可以使用命名范围而不是内置的列标题,但是基本思想与对此的其他答案相同,并且在本网站中建议使用其他类似问题:电子表格应设置为构建动态SQL字符串。
让说,J和G对应于指定范围Grades和Class分别。
CELL("address",Grades)会回来的"$J:$J"。要获取列引用,请使用MID(CELL("address",Grades),2,1)get "J"。最终公式是
= QUERY(B:J,“ SELECT AVG(”& MID(CELL(“ address”,Grades),2,1)& “) 通过...分组 ”& MID(CELL(“ address”,Class),2,1))
COLUMN(Grades)将返回一个整数(格式为1,2,3等的数字)。为了简化公式以创建SQL语句参数,我建议通过使用数组来强制SQL使用COL1,COL2等格式的列引用。记号({B:J})。最终公式是
= QUERY({B:J},“ SELECT AVG(Col”&COLUMN(Grades)-1&“)GROUP BY Col”&COLUMN(Class)-1)
Ruben的答案并不能在所有情况下都解决问题,因为MID(CELL("address",Grades),2,1)如果将Grades范围移动到的双字母列,则会失败$AA:$AA。
在这种情况下,MID(CELL("address",Grades),2,2)需要公式。对于跨越或邻接$Z:$AA范围的命名范围,此公式会出现问题。
该公式REGEXEXTRACT( CELL("address", Grades), "\$([a-zA-Z]+)\$")解决了一般情况下的问题,但是我强烈质疑在整个大型电子表格中使用它时的CPU效率。
我在infoinspired.com上看到了该页面,该页面解释了一种实现方法。我完全按照他给出的示例进行了测试,并且可以正常工作。设置:
A B F G
1 names Age =left(address(row(B1),column(B1),4)) =QUERY(A:B,"Select "&Age)
2 joey 32
3 nicole 26
4 sally 66
他对F1的解释:包括ROW和COLUMN函数的ADDRESS公式返回B1的单元地址。LEFT函数从中提取列标题的第一个字母。
---单击单元格F1,然后转到菜单“数据”>“命名范围”,并将范围命名为“年龄”(不带引号)
现在,您可以将查询表述为: =QUERY(A:B,"Select "&Age)
他的页面上有许多更复杂的示例,我现在要对其进行测试,但是我很高兴第一个示例可行!
编辑-很抱歉,如果这正是其他人提出的答案。我只是发现这个示例非常清晰,并且能够弄清楚。认为这可能会帮助其他人解决相同的问题。