BAB 6: Sambungkan Dua Tabel: Join
#Studi kasus: "Datanya ada di dua berkas"
Regu lapangan mengirim Inventarisasi.csv: jumlah pohon dan volume kayu tiap petak. Isinya tidak ada di tabel petak, sehingga belum bisa muncul di peta. Kepala Seksi bertanya, "Petak mana yang paling padat kayunya?" Anda perlu menyambungkan dua tabel itu supaya setiap petak membawa angka inventarisasinya.
#Konsep: join dalam tiga kalimat
Join adalah menyambung dua tabel lewat satu kolom yang isinya sama, seperti mencocokkan nomor anggota di dua daftar berbeda untuk menyatukan data orang yang sama. Kolom pencocok itu disebut kunci. Tiap baris di tabel petak dicari pasangannya di tabel inventarisasi, lalu kolom tambahan disalin ke baris petak itu.
Istilah baru bab ini:
- Join: menyambung tabel lewat kolom kunci.
- Kunci (key): kolom yang isinya dipakai untuk mencocokkan.
- Tabel tanpa bentuk: tabel yang hanya berisi angka dan teks, tanpa gambar di peta (misalnya CSV).
- Join virtual: sambungan sementara yang berlaku di proyek, tanpa membuat berkas baru.
- Tanpa pasangan: baris yang kuncinya tidak ditemukan di tabel satunya.

#Kunci harus persis sama
Komputer mencocokkan kunci huruf demi huruf. P-09 berbeda dengan p-09, dan P-09 (dengan spasi di ujung) berbeda dengan P-09. Hampir semua masalah join berasal dari kunci yang hampir sama tetapi tidak persis sama.
#Angka dari data latihan
Inventarisasi.csv memiliki 16 baris. Penulis sengaja menyisipkan tiga keanehan: petak P-12 tidak ada, kode P-09 tertulis huruf kecil (p-09), dan ada baris P-17 yang tidak punya petak. Hasil di QGIS 4.0.2:
| Tahap | Petak cocok | Petak tanpa pasangan | Baris tabel yang tidak punya petak |
|---|---|---|---|
| Join pertama (kunci apa adanya) | 14 | P-09, P-12 | p-09, P-17 |
| Setelah kunci diperbaiki | 15 | P-12 | P-17 |
P-12 memang tidak punya data inventarisasi, dan itu bukan galat join. Setelah perbaikan, hasil hitung dari 15 petak berisi data:
| Ukuran | Nilai |
|---|---|
| Total pohon | 13.262 pohon |
| Total volume | 2.761,7 m³ |
| Volume per hektare tertinggi | P-13: 295,4 m³/ha |
| Rekap pohon KPH Alpha / Beta / Gamma | 3.595 / 3.475 / 6.192 pohon (4, 4, dan 7 petak berisi data) |
Jadi jawaban untuk Kepala Seksi: petak paling padat kayunya adalah P-13 (jati, tanam 2005), dengan 295,4 m³ per hektare.
#Bagian A: QGIS
#Bagian A: Join di QGIS
#Langkah 1: muat tabel CSV
- Buka Layer ► Add Layer ► Add Delimited Text Layer…. [CEK: letak menu]
- File name: pilih
Inventarisasi.csv. File format: CSV (comma separated values). - Pada Geometry definition, pilih No geometry (attribute only table).
- Pastikan opsi deteksi tipe kolom menyala. Lihat tabel contoh di bagian bawah jendela:
JML_POHONharus bilangan bulat danVOLUME_M3desimal. Klik Add, lalu Close. - Tabel muncul di panel Layers tanpa ikon peta. Buka tabelnya (F6): 16 baris.
#Langkah 2: join tetap (menghasilkan layer baru)
- Buka Processing ► Toolbox, cari
Join attributes by field value, lalu klik dua kali. - Isi:
- Input layer:
Petak(atauPetak_Hitungdari bab 5), Table field:KODE_PETAK - Input layer 2:
Inventarisasi, Table field 2:KODE_PETAK - Layer 2 fields to copy:
JML_POHON,VOLUME_M3,TGL_UKUR - Join type: ambil pasangan pertama saja (satu ke satu)
- Discard records which could not be joined: kosongkan centang
- Joined field prefix:
inv_
- Klik Run. Layer Joined layer muncul. Alat ini juga menghasilkan layer opsional berisi petak yang tidak mendapat pasangan. [CEK: nama pilihan di jendela]
- Buka tabel layer hasil. Kolom
inv_JML_POHON,inv_VOLUME_M3, daninv_TGL_UKURada di ujung kanan. - Periksa pasangan yang hilang: Select Features by Expression, ketik
"inv_JML_POHON" IS NULL. Pada join pertama terpilih 2 petak: P-09 dan P-12.
Layer hasil masih berupa layer sementara. Simpan permanen lewat klik kanan ► Export ► Save Features As… [CEK: letak menu].
#Langkah 3: perbaiki kunci
P-09 gagal karena kuncinya p-09. Ada dua cara.
Cara A (paling sederhana): buka Inventarisasi.csv di Notepad atau lembar hitung, ubah p-09 menjadi P-09, simpan, lalu ulangi join.
Cara B (tanpa menyentuh berkas): buat kolom kunci bersih lewat Processing.
- Cari alat
Field calculatordi Toolbox (bukan yang di toolbar). - Input layer:
Inventarisasi. Field name:KUNCI. Result field type:Text (string), length 10. - Formula:
upper(trim("KODE_PETAK"))- Run. Hasilnya tabel sementara dengan kolom
KUNCIberisiP-09.trimmembuang spasi di ujung,uppermengubah ke huruf besar. - Ulangi join, tetapi untuk Table field 2 pilih
KUNCI. - Sekarang 15 petak cocok. Hanya P-12 yang kosong, dan itu memang tidak ada datanya.
#Langkah 4: hitung dari hasil join
Pada layer hasil join, jalankan Field Calculator (bab 5) dua kali:
| Nama field | Tipe | Ekspresi |
|---|---|---|
POHON_HA | Decimal, presisi 1 | round("inv_JML_POHON" / "LUAS_HA", 1) |
VOL_HA | Decimal, presisi 1 | round("inv_VOLUME_M3" / "LUAS_HA", 1) |
Urutkan VOL_HA dari besar ke kecil. Baris teratas: P-13 dengan 295,4. Baris P-12 kosong, jadi hitungannya ikut kosong.
#Join virtual (tanpa berkas baru)
Cara lain adalah join yang hidup di proyek saja.
- Klik dua kali layer
Petakuntuk membuka Properties, lalu tab Joins. - Klik tombol + (Add new join).
- Isi Join layer:
Inventarisasi, Join field:KODE_PETAK, Target field:KODE_PETAK. - Pilih kolom mana yang disambung. Centang Custom field name prefix dan isi
inv_. Centang Cache join layer in virtual memory bila ingin lebih cepat. - Klik OK. Kolom baru muncul di tabel
Petak, tetapi tidak tertulis ke berkasPetak_KPH.gpkg.
Pada data latihan, join virtual dengan kunci apa adanya mengisi 14 petak, sama seperti join tetap pertama.
#Pilihan: join lewat Python
Skrip 6.1 (skrip/b2_06_join.py) menjalankan semua langkah di atas. Jalankan Skrip 5.1 lebih dulu.
g = processing.run("native:joinattributestable", {
"INPUT": petak, "FIELD": "KODE_PETAK", "INPUT_2": inv, "FIELD_2": "KODE_PETAK",
"FIELDS_TO_COPY": ["JML_POHON", "VOLUME_M3", "TGL_UKUR"], "METHOD": 1,
"DISCARD_NONMATCHING": False, "PREFIX": "inv_", "OUTPUT": "memory:", "NON_MATCHING": "memory:"})Hasil uji: tipe kolom CSV terbaca text, integer, double, date, dan text. Join pertama 14 cocok (tanpa pasangan P-09 dan P-12). Setelah kunci diperbaiki, 15 cocok. Total pohon 13.262, total volume 2.761,7 m³. Join virtual mengisi 14 petak.
#Bagian B: ArcGIS Pro
#Bagian B: ArcGIS Pro
- Tambahkan
Inventarisasi.csvke peta, lalu klik kanan ► Open untuk melihat tabelnya. [CEK] - Buka alat Add Join (Data Management Tools). Isi Input Table
Petak, Input Join FieldKODE_PETAK, Join TableInventarisasi, dan Join Table FieldKODE_PETAK. - Opsi Keep All Target Features (di Pro disebut Keep all input records) menyala: semua petak tetap tampil walau tanpa pasangan. Bila dimatikan, hanya petak yang cocok tampil.
- Join dari Add Join bersifat sementara: tinggal di layer, bukan di data. Untuk menjadikannya permanen, pakai alat Join Field, atau ekspor hasilnya dengan Copy Features atau Export Features.
- Perhatikan: ArcGIS Pro mengenali huruf besar dan kecil pada kunci tergantung sumber datanya. Cocokkan huruf kuncinya lebih dulu. [CEK]
#Bagian C: ArcMap 10.8
#Bagian C: ArcMap 10.8
- Tambahkan
Inventarisasi.csv. Klik kanan layerPetak► Joins and Relates ► Join…. [CEK] - Pilih Join attributes from a table. Isi field di layer
KODE_PETAK, tabel yang disambungInventarisasi, dan field kunciKODE_PETAK. - Pilih Keep all records agar petak tanpa pasangan tetap tampil. [CEK]
- Join ini sementara. Untuk membuatnya permanen, ekspor layer lewat Data ► Export Data atau pakai alat Join Field. [CEK]
- Pada ArcMap, kolom hasil join diberi awalan nama tabel, misalnya
Inventarisasi.JML_POHON. [CEK]
#Cek paham
- Mengapa
p-09tidak cocok denganP-09? - Apa artinya petak "tanpa pasangan", dan haruskah selalu dianggap galat?
- Apa beda join virtual dan join tetap?
Jawaban:
- Pencocokan kunci dilakukan huruf demi huruf, dan huruf kecil berbeda dari huruf besar.
- Artinya kuncinya tidak ditemukan di tabel satunya. Tidak selalu galat. P-12 memang belum punya data. Yang perlu diperiksa adalah penyebabnya: salah ketik atau memang kosong.
- Join virtual hidup di proyek dan tidak membuat berkas baru. Join tetap menghasilkan layer atau berkas baru yang membawa kolom hasil sambungan.
#Kesalahan umum
- Kunci beda huruf atau berspasi. Petak tidak mendapat pasangan. Samakan dengan
upperdantrim. - Tidak memeriksa yang tanpa pasangan. Hasil terlihat benar, padahal sebagian kosong. Hitung baris kosong dengan
IS NULL. - Tipe kunci berbeda. Kunci angka di satu tabel dan teks di tabel lain tidak cocok. Samakan tipenya.
- Mengira join virtual mengubah data. Berkas asli tetap utuh. Bila kolomnya perlu dibawa, ekspor hasilnya.
- Awalan nama kolom hilang. Dua kolom bernama sama bertabrakan. Beri awalan, misalnya
inv_.
#Ringkasan dan latihan
Ringkasan: join menyambung dua tabel lewat kunci yang persis sama. Periksa petak tanpa pasangan, perbaiki kunci bila perlu, lalu hitung dari hasil join. Join virtual cepat dan sementara, join tetap menghasilkan layer baru.
Latihan: dengan hasil join, buat kolom STATUS_DATA yang bernilai Lengkap bila inv_JML_POHON terisi dan Belum ada bila kosong. Berapa petak Belum ada? (Petunjuk: if("inv_JML_POHON" IS NULL, 'Belum ada', 'Lengkap'). Jawaban: 1 petak setelah kunci diperbaiki, yaitu P-12.)
#Tabel perbandingan: join
| Tugas | QGIS | ArcGIS Pro | ArcMap 10.8 |
|---|---|---|---|
| Memuat CSV | Add Delimited Text Layer | Add Data | Add Data |
| Join sementara | Properties ► Joins | Add Join | Joins and Relates ► Join |
| Join permanen | Alat Join attributes by field value | Join Field [CEK] | Ekspor layer atau Join Field [CEK] |
| Petak tanpa pasangan | Tersisa kosong (NULL); bisa dibuang | Keep all input records | Keep all records [CEK] |
| Awalan kolom | Custom field name prefix | Otomatis oleh alat [CEK] | Nama tabel di depan [CEK] |