我可以在= QUERY中使用列标题吗?


16

阅读文档的=QUERY功能123,它的一些似乎在暗示,我应该可以直接在我的查询中使用的列标题。例如,该=QUERY功能需要一个第三个可选参数HEADERS,用于指定一个号码标题行的。

如果我可以使用列标题,那么我的大多数查询将更加漂亮,因此不必使用列索引,但是我无法使其工作。

例:

A      B         C
---------------------
Name   Phone     City
Vidar  12345678  Oslo
Rupert 32165487  Berlin

我可以使用列索引查询此:

=QUERY(Sheet1!A1:C; "select A, B, C where A = 'Vidar'"; 1)

...但不使用列标题:

=QUERY(Sheet1!A1:C; "select A, B, C where Name = 'Vidar'"; 1)

...这给我错误:错误的查询:表中不存在列[名称]

是否可以使用像这样的列标题?如果不是,该HÈADERS参数的目的是什么?

Answers:


4

您在QUERY函数中提到的第三个参数是用来控制标题的。如果设置为-1,则Google Spreadsheet将根据可用数据描述选择标题时的选择: 在此处输入图片说明

我使用了以下数据集: 在此处输入图片说明

如果将设置为0,则将不使用任何标头,从而保留: 在此处输入图片说明

如果设置为1,则将使用第一行,并保留: 在此处输入图片说明

如果设置为2-1left blank,则将使用前两行,并保留: 在此处输入图片说明

使用标头无法实现示例中的方式。最接近的QUERY答案中描述的功能用法。那里使用了准列名。


嗯,好的,所以如果HEADERS > 0给定数量的标题行将=QUERY在查询结果的顶部返回,是吗?这很有意义-我认为HEADERS在查询中只忽略了指定的行。
Vidar S. Ramdal

@Vidar该OFFSET选项可用于忽略第一行。
Jacob Jan Tuinstra 2014年

根据我的经验,将headers参数设置为0并不会执行Google文档描述的内容或此处描述的内容。据我所知,它基本上什么也不做(即与-1相同)。有没有其他人注意到这一点?
user24601

1
我相信原始张贴者的意图不是要在报告中获取标题,而是要在查询语句中使用标题名称,而不是必须使用列索引(如A或B或C)。
Farrel

7

是否可以使用像这样的列标题?

对的,这是可能的。首先,您需要使用MATCH来获取其值与“名称”匹配的列的列号。然后,您需要使用ADDRESS来获取单元格引用。最后,您需要使用SUBSTITUTE从单元格引用中删除行号。

=QUERY(Sheet1!A1:C,"SELECT A, B, C where "&SUBSTITUTE(ADDRESS(1,MATCH("Name",Sheet1!A1:C1,0),4),1,"")&" = 'Vidar'")

3

在发表旧文章时,我想将我的解决方案添加到组合中。您可以使用列名,我觉得它更有用。这样,当您在源数据中插入或删除列时,您不必编辑查询函数调用。

我看到其他人使用匹配和替代,我实现了一些与简单查询功能调用有所不同的东西。

首先-像这样创建所有列名称的查找表。我的查找表仅从“配置”表的E列开始,因为我在表单上还有其他项,因此可以轻松地将其放在自己的表单中。

  • 第1列(列名)

    =TRANSPOSE( 'Source Data'!1:1 )
    
  • 第2栏(#栏)

    =arrayformula( row( E2:E ) - 1 )
    
  • 第三栏(栏目字母)

    =arrayformula( if( int( F2:F / 26.5 ) > 0, char( int( F2:F / 26.5 )  + 64), "" ) & char( (F2:F - (int( F2:F / 26.5 ) * 26 ) ) + 64 ) )
    

    我愿意将列号转换为字母。该公式的局限性在于它只能处理78列。虽然对我来说绰绰有余。

现在,您的Query函数调用将如下所示:

=query( 'Source Data'!$A:$L,
"Select " & " " &
vlookup( "Date", Config!$E:$G, 3, false ) & ", " &
vlookup( "Dev Query Engine Conn Count", Config!$E:$G, 3, false ) & ", " &
vlookup( "Dev Conn Limit Retry Count", Config!$E:$G, 3, false ) & ", " &
vlookup( "Dev Max Sequential Retry in One Minute", Config!$E:$G, 3, false ) & ", " &
vlookup( "Dev Conn Limit Errors", Config!$E:$G, 3, false ) & " " &
"where " & vlookup( "Display in Graph.", Config!$E:$G, 3, false ) & "=TRUE " &
"order by " & vlookup( "Date", Config!$E:$G, 3, false ) & " desc "
)

保持格式正确,完全可以管理。您将遭受的唯一痛苦是,如果您更改vlookup范围的列索引。但是,考虑到它是一个辅助范围,这应该不会经常更改(如果有的话)。


3

旧问题,但我认为这种解决方案可能值得。

您可以使用自定义脚本函数,该函数使用标题名称检索列索引(即A,B,C ...),从而可以执行以下操作:

=query('MySheet'!A2:Z; 
   "select "&colIndex("'MySheet'!A1:Z1"; "Car name")&"  
    where "&colIndex("'MySheet'!A1:Z1"; "Car color")&"='Blue'"))

具有colIndex功能:

function colIndex(a1NotationStr, header){
  var range = SpreadsheetApp.getActiveSpreadsheet().getRange(a1NotationStr)
  var row = range.getValues()[0]

  //parse the header row and stop at first header matching our search
  //use the related cell A1Notation and remove all numbers (i.e. 'A45' becomes 'A')
  for(var i=0; i<row.length; i++){
    var currHeader = row[i]
    if(currHeader == header){
      return range.getCell(1, i+1).getA1Notation().replace(/[0-9]/g, '');
    }  
  }
}

这可能更易于使用和阅读。


0

这是我的解决方案:

如果您有一列名为“ city”的列,则在该位置用该单元的索引创建一个新单元:

   A          B               C        ...         Y               Z        
 --------- ------------ ------------ ------ --------------- --------------- 
  Name        Phone        City        ...    Column Name     Column Index  
  Vidar      12345678     Oslo         ...    Name           A              
  Rupert     32165487     Berlin       ...    Phone          B              
  Sahid      32165487     Colombo      ...    City           C              

然后,您可以为单元格Z:2创建一个命名范围,称为:“ name”,Z:3 =“ phone”,Z:4 =“ city”

在查询中,您可以编写:

=QUERY( Sheet1!A1:C,"SELECT A, B, C where "&name&" = 'Vidar'"

您可以将其与地址匹配解决方案结合使用,而不必跟踪重新排列的列。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.