Bisakah saya menggunakan tajuk kolom dalam = QUERY?

16

Membaca dokumentasi untuk =QUERYfungsi 1 , 2 , 3 , beberapa di antaranya sepertinya menyiratkan bahwa saya harus dapat menggunakan tajuk kolom secara langsung dalam kueri saya. Misalnya, =QUERYfungsi mengambil parameter opsional ketiga , HEADERSyang memungkinkan Anda menentukan jumlah baris sundulan.

Sebagian besar pertanyaan saya akan jauh lebih cantik jika saya bisa menggunakan tajuk kolom, sehingga tidak harus menggunakan indeks kolom, tapi saya tidak dapat membuatnya berfungsi.

Contoh:

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

Saya dapat menanyakan ini dengan menggunakan indeks kolom:

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

... tetapi tidak menggunakan tajuk kolom:

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

... ini memberi saya Kesalahan: Kueri tidak valid: Kolom [Nama] tidak ada dalam tabel

Apakah mungkin menggunakan tajuk kolom seperti ini? Jika tidak, apa tujuan dari HÈADERSparameter tersebut?

Vidar S. Ramdal
sumber

Jawaban:

4

Parameter ketiga yang Anda bicarakan dalam QUERYfungsi, dimaksudkan untuk mengontrol tajuk. Jika diatur menjadi -1, maka Google Spreadsheet akan menggambarkan pilihannya sendiri dalam memilih header, berdasarkan data yang tersedia: masukkan deskripsi gambar di sini

Saya telah menggunakan kumpulan data berikut: masukkan deskripsi gambar di sini

Jika diatur menjadi 0, maka tidak ada tajuk yang akan digunakan, meninggalkan: masukkan deskripsi gambar di sini

Jika diatur menjadi 1, maka baris pertama akan digunakan, meninggalkan: masukkan deskripsi gambar di sini

Jika diatur menjadi 2atau -1atau left blank, maka dua baris pertama akan digunakan, meninggalkan: masukkan deskripsi gambar di sini

Menggunakan header, seperti yang Anda lakukan dalam contoh, tidak mungkin. Hal terdekat adalah penggunaan QUERYfungsi, yang dijelaskan dalam jawaban ini . Ada nama kolom kuasi digunakan.

Jacob Jan Tuinstra
sumber
Ah, OK, jadi jika HEADERS > 0kemudian jumlah baris tajuk yang diberikan akan dikembalikan =QUERYdi atas hasil kueri, kan? Itu masuk akal - saya pikir HEADERShanya baris tertentu untuk diabaikan dalam permintaan.
Vidar S. Ramdal
@Vidar OFFSETOpsi ini dapat digunakan untuk mengabaikan baris pertama.
Jacob Jan Tuinstra
Dalam pengalaman saya mengatur parameter header ke 0 tidak melakukan apa yang dijelaskan Google docs atau apa yang digambarkan di sini. Ini pada dasarnya tidak melakukan apa pun (yaitu, sama dengan -1) sejauh yang saya tahu. Adakah yang memperhatikan ini?
user24601
Saya percaya maksud dari poster asli bukan tentang mendapatkan tajuk di laporan tetapi tentang menggunakan nama tajuk dalam pernyataan permintaan daripada harus menggunakan indeks kolom (seperti dalam A atau B atau C).
Farrel
7

Apakah mungkin menggunakan tajuk kolom seperti ini?

Ya itu mungkin. Pertama, Anda perlu menggunakan MATCH untuk mendapatkan nomor kolom dari kolom yang nilainya cocok dengan 'Nama'. Maka Anda perlu menggunakan ADDRESS untuk mendapatkan referensi sel. Terakhir, Anda perlu menggunakan SUBSTITUTE untuk menghapus nomor baris dari referensi sel.

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

Sementara posting lama, saya ingin menambahkan solusi saya ke dalam campuran. Anda dapat menggunakan nama kolom yang menurut saya lebih berguna. Dengan cara ini Anda tidak perlu mengedit panggilan fungsi kueri saat Anda menyisipkan atau menghapus kolom dari data sumber.

Saya telah melihat orang lain menggunakan pertandingan dan pengganti, saya menerapkan sesuatu yang sedikit berbeda dengan panggilan fungsi permintaan.

Pertama - Buat tabel pencarian semua nama kolom Anda seperti ini. Tabel pencarian saya dimulai pada Kolom E dari lembar 'Konfig' hanya karena saya memiliki item lain di lembar, itu dapat dengan mudah ditempatkan di lembar sendiri.

  • Kolom 1 (Nama Kolom)

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

    =arrayformula( row( E2:E ) - 1 )
    
  • Kolom 3 (Surat Kolom)

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

    Saya terbuka pada penyempurnaan untuk mengonversi nomor kolom menjadi huruf. Formula ini terbatas karena hanya menangani 78 kolom. Lebih dari cukup bagi saya.

Sekarang panggilan fungsi Kueri Anda akan terlihat seperti ini:

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

Tetap diformat dengan baik dan tidak buruk untuk dikelola sama sekali. Satu-satunya hal yang akan Anda derita adalah jika Anda mengubah indeks kolom rentang vlookup Anda. Tapi ini seharusnya tidak sering berubah, jika sama sekali, mengingat itu adalah kisaran penolong.

Mengenakan
sumber
3

Pertanyaan lama, tapi saya pikir solusi ini mungkin sepadan.

Anda dapat menggunakan fungsi skrip khusus yang mengambil indeks kolom (yaitu A, B, C ...) menggunakan nama header, memungkinkan untuk melakukan sesuatu seperti:

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

Dengan colIndexfungsi:

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

Yang mungkin lebih mudah digunakan dan dibaca.

Pierre B.
sumber
0

Inilah solusi saya:

jika Anda memiliki kolom yang disebut "kota", buat sel baru di suatu tempat dengan indeks sel itu:

   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              

Anda kemudian dapat membuat rentang bernama untuk sel Z: 2 bernama: "name", Z: 3 = "phone", Z: 4 = "city"

dalam kueri Anda, Anda kemudian dapat menulis:

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

Anda dapat menggabungkan ini dengan solusi pencocokan alamat, untuk tidak harus melacak kolom yang disusun ulang.

Timar Ivo Batis
sumber