Kann ich Spaltenüberschriften in einer = QUERY verwenden?

16

Beim Lesen der Dokumentation für die =QUERYFunktionen 1 , 2 , 3 scheint ein Teil davon zu implizieren, dass ich in der Lage sein sollte, Spaltenüberschriften direkt in meiner Abfrage zu verwenden. Beispielsweise akzeptiert die =QUERYFunktion einen dritten optionalen Parameter , HEADERSmit dem Sie eine Anzahl von Kopfzeilen angeben können.

Die meisten meiner Abfragen wären viel hübscher, wenn ich Spaltenüberschriften verwenden könnte, also keine Spaltenindizes verwenden müsste, aber ich bin nicht in der Lage, es zum Laufen zu bringen.

Beispiel:

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

Ich kann dies mithilfe von Spaltenindizes abfragen:

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

... aber ohne Spaltenüberschriften:

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

... das gibt mir Fehler: Ungültige Abfrage: Spalte [Name] existiert nicht in Tabelle

Ist es überhaupt möglich, Spaltenüberschriften wie diese zu verwenden? Wenn nicht, wozu dient der HÈADERSParameter?

Vidar S. Ramdal
quelle

Antworten:

4

Der dritte Parameter, von dem Sie in der QUERYFunktion sprechen , dient zur Steuerung der Header. Wenn dies festgelegt ist -1, zeigt die Google-Tabelle anhand der verfügbaren Daten die Auswahl der Überschriften nach eigenem Ermessen an: Bildbeschreibung hier eingeben

Ich habe folgenden Datensatz verwendet: Bildbeschreibung hier eingeben

Wenn dies festgelegt ist 0, wird kein Header verwendet. Bildbeschreibung hier eingeben

Wenn festgelegt 1, wird die erste Zeile verwendet. Bildbeschreibung hier eingeben

Wenn der Wert auf 2oder -1oder gesetzt ist left blank, werden die ersten beiden Zeilen verwendet. Bildbeschreibung hier eingeben

Es ist nicht möglich, die Header so zu verwenden, wie Sie es in Ihrem Beispiel getan haben. Am nächsten wäre die Verwendung der QUERYin dieser Antwort beschriebenen Funktion . Dort wird quasi ein Spaltenname verwendet.

Jacob Jan Tuinstra
quelle
Ah, OK, wenn HEADERS > 0dann die angegebene Anzahl von Kopfzeilen =QUERYüber den Abfrageergebnissen zurückgegeben wird, richtig? Das macht Sinn - ich dachte, HEADERSnur bestimmte Zeilen in der Abfrage zu ignorieren.
Vidar S. Ramdal
@Vidar Mit dieser OFFSETOption können die ersten Zeilen ignoriert werden.
Jacob Jan Tuinstra
Nach meiner Erfahrung entspricht das Setzen des Headers-Parameters auf 0 nicht dem, was in Google Text & Tabellen beschrieben oder hier abgebildet ist. Soweit ich das beurteilen kann, macht es im Grunde nichts (dh dasselbe wie -1). Hat das jemand anderes bemerkt?
user24601
Ich glaube, die Absicht des ursprünglichen Posters bestand nicht darin, Überschriften in den Bericht aufzunehmen, sondern Überschriften in der Abfrageanweisung zu verwenden, anstatt Spaltenindizes zu verwenden (wie in A oder B oder C).
Farrel
7

Ist es überhaupt möglich, Spaltenüberschriften wie diese zu verwenden?

Ja, es ist möglich. Zuerst müssen Sie MATCH verwenden, um die Spaltennummer der Spalte abzurufen, deren Wert mit 'Name' übereinstimmt. Dann müssen Sie ADDRESS verwenden, um die Zellreferenz zu erhalten. Schließlich müssen Sie SUBSTITUTE verwenden, um die Zeilennummer aus dem Zellbezug zu entfernen.

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

Während eines alten Beitrags wollte ich meine Lösung zum Mix hinzufügen. Sie können Spaltennamen verwenden, die ich für nützlicher halte. Auf diese Weise müssen Sie Ihre Abfragefunktionsaufrufe nicht bearbeiten, wenn Sie Spalten in die Quelldaten einfügen oder daraus entfernen.

Ich habe gesehen, dass andere das Match und das Substitute verwenden. Ich habe etwas anderes implementiert, als nur den Aufruf der Abfragefunktion.

Erstens - Erstellen Sie eine Nachschlagetabelle mit all Ihren Spaltennamen wie folgt. Meine Nachschlagetabelle beginnt in Spalte E eines "Config" -Blatts, nur weil ich andere Elemente auf dem Blatt habe, könnte es leicht in ein eigenes Blatt platziert werden.

  • Spalte 1 (Spaltenname)

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

    =arrayformula( row( E2:E ) - 1 )
    
  • Spalte 3 (Spaltenbuchstabe)

    =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 ) )
    

    Ich bin offen für Verbesserungen, um eine Spaltennummer in einen Buchstaben umzuwandeln. Diese Formel ist insofern begrenzt, als sie nur 78 Spalten verarbeitet. Mehr als genug für mich.

Jetzt würde Ihr Abfragefunktionsaufruf ungefähr so ​​aussehen:

=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 "
)

Halten Sie es schön formatiert und es ist überhaupt nicht schlecht zu verwalten. Sie leiden nur, wenn Sie den Spaltenindex Ihres Lookup-Bereichs ändern. Dies sollte sich jedoch nicht oft, wenn überhaupt, ändern, da es sich um eine Hilfsreichweite handelt.

Don
quelle
3

Alte Frage, aber ich denke, diese Lösung kann es wert sein.

Sie können eine benutzerdefinierte Skriptfunktion verwenden, die den Spaltenindex (dh A, B, C ...) unter Verwendung eines Headernamens abruft und Folgendes ermöglicht:

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

Mit colIndexfunktion:

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, '');
    }  
  }
}

Welche möglicherweise einfacher zu bedienen und zu lesen sind.

Pierre B.
quelle
0

Hier ist meine Lösung:

Wenn Sie eine Spalte mit dem Namen "Stadt" haben, erstellen Sie irgendwo eine neue Zelle mit dem Index dieser Zelle:

   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              

Sie können dann einen benannten Bereich für die Zelle Z: 2 mit dem Namen "Name", Z: 3 = "Telefon", Z: 4 = "Stadt" erstellen.

In Ihrer Anfrage können Sie dann schreiben:

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

Sie können dies mit der Adressanpassungslösung kombinieren, damit Sie die neu angeordneten Spalten nicht im Auge behalten müssen.

Timar Ivo Batis
quelle