Posso usare le intestazioni di colonna in a = QUERY?


16

Leggendo la documentazione per la =QUERYfunzione 1 , 2 , 3 , alcuni sembrano implicare che dovrei essere in grado di utilizzare le intestazioni di colonna direttamente nella mia query. Ad esempio, la =QUERYfunzione di prende un terzo parametro opzionale , HEADERSche consente di specificare un certo numero di righe di intestazione.

La maggior parte delle mie query sarebbe molto più bella se potessi usare le intestazioni di colonna, quindi non dovrei usare gli indici di colonna, ma non sono in grado di farlo funzionare.

Esempio:

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

Sono in grado di eseguire una query utilizzando gli indici di colonna:

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

... ma non usando le intestazioni di colonna:

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

... questo mi dà errore: query non valida: la colonna [nome] non esiste nella tabella

È possibile utilizzare le intestazioni di colonna in questo modo? In caso contrario, qual è lo scopo del HÈADERSparametro?

Risposte:


4

Il terzo parametro di cui parli nella QUERYfunzione è pensato per controllare le intestazioni. Se impostato su -1, allora il foglio di calcolo di Google illustrerà la propria scelta nella scelta delle intestazioni, in base ai dati disponibili: inserisci qui la descrizione dell'immagine

Ho usato il seguente set di dati: inserisci qui la descrizione dell'immagine

Se impostato su 0, non verrà utilizzata alcuna intestazione, lasciando: inserisci qui la descrizione dell'immagine

Se impostato su essere 1, verrà utilizzata la prima riga, lasciando: inserisci qui la descrizione dell'immagine

Se impostato su essere 2o -1o left blank, verranno utilizzate le prime due righe, lasciando: inserisci qui la descrizione dell'immagine

L'uso delle intestazioni, come hai fatto nel tuo esempio, non è possibile. La cosa più vicina sarebbe l'uso della QUERYfunzione, descritta in questa risposta. Lì viene usato un nome quasi colonna.


Ah, OK, quindi se HEADERS > 0poi il dato numero di righe di intestazione verrà restituito =QUERYin cima ai risultati della query, giusto? Questo ha senso: pensavo che HEADERSsolo le righe specificate fossero ignorate nella query.
Vidar S. Ramdal,

@Vidar L' OFFSETopzione può essere utilizzata per ignorare le prime righe.
Jacob Jan Tuinstra,

Nella mia esperienza, l'impostazione del parametro headers su 0 non fa ciò che descrivono i documenti di Google o ciò che è rappresentato qui. Fondamentalmente non fa nulla (cioè uguale a -1) per quanto ne so. Qualcun altro l'ha notato?
user24601,

Credo che l'intenzione del poster originale non fosse quella di ottenere le intestazioni nel rapporto, ma piuttosto di usare i nomi delle intestazioni nell'istruzione della query piuttosto che dover usare gli indici di colonna (come in A o B o C).
Farrel,

7

È possibile utilizzare le intestazioni di colonna in questo modo?

Sì, è possibile. Innanzitutto, è necessario utilizzare MATCH per ottenere il numero di colonna della colonna il cui valore corrisponde a "Nome". Quindi è necessario utilizzare ADDRESS per ottenere il riferimento di cella. Infine, è necessario utilizzare SUBSTITUTE per rimuovere il numero di riga dal riferimento di cella.

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

3

Mentre ero un vecchio post, volevo aggiungere la mia soluzione al mix. Puoi usare i nomi delle colonne che trovo più utili. In questo modo non è necessario modificare le chiamate della funzione di query quando si inseriscono o rimuovono le colonne dai dati di origine.

Ho visto gli altri usare la corrispondenza e il sostituto, ho implementato qualcosa di leggermente diverso dalla semplice chiamata alla funzione query.

Primo: crea una tabella di ricerca con tutti i nomi delle colonne in questo modo. La mia tabella di ricerca inizia nella colonna E di un foglio 'Config' solo perché ho altri elementi sul foglio, potrebbe essere facilmente inserito nel suo foglio.

  • Colonna 1 (Nome colonna)

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

    =arrayformula( row( E2:E ) - 1 )
    
  • Colonna 3 (colonna lettera)

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

    Sono aperto ai perfezionamenti per convertire un numero di colonna in una lettera. Questa formula è limitata in quanto gestisce solo 78 colonne. Più che sufficiente per me però.

Ora la tua chiamata alla funzione Query sarebbe simile a questa:

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

Mantenerlo ben formattato e non è affatto male da gestire. L'unica cosa che subirai è se cambi l'indice di colonna del tuo intervallo di vlookup. Ma questo non dovrebbe cambiare spesso, se non del tutto, considerando che si tratta di una gamma di aiuto.


3

Vecchia domanda, ma penso che questa soluzione possa valerne la pena.

È possibile utilizzare una funzione di script personalizzata che recupera l'indice di colonna (ovvero A, B, C ...) utilizzando un nome di intestazione, consentendo di fare qualcosa del tipo:

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

Con colIndexfunzione:

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

Quale può essere più facile da usare e leggere.


0

Ecco la mia soluzione:

se hai una colonna chiamata "città" crea una nuova cella da qualche parte con l'indice di quella cella:

   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              

È quindi possibile creare un intervallo denominato per la cella Z: 2 chiamato: "nome", Z: 3 = "telefono", Z: 4 = "città"

nella tua query puoi quindi scrivere:

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

Puoi combinarlo con la soluzione di corrispondenza degli indirizzi, per non dover tenere traccia delle colonne riorganizzate.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.