Lompati ke konten utama
Modul 3 · Pelajaran 3 dari 411/57 dalam kursus~10 min
Pelajaran modul (3/4)

Pengelompokan dengan GROUP BY

Di Modul 2 Anda mempelajari bahwa COUNT(*), AVG(...), SUM(...) mengurangi semua baris ke baris hasil tunggal. Namun bagaimana jika Anda menginginkan gaji rata-rata untuk setiap departemen, bukan untuk seluruh perusahaan? Anda ingin satu baris per grup. Itulah tugas GROUP BY.

Sintaksnya

SQL
SELECT grouping_column, AGGREGATE_FUNCTION(...)
FROM   table
GROUP BY grouping_column;

Baca dalam bahasa Inggris: "bagi baris-baris menjadi beberapa kelompok yang mempunyai nilai yang sama grouping_column, dan untuk setiap kelompok hitung agregatnya".

SQL
-- Average salary per department:
SELECT department_id, AVG(salary) AS average
FROM   employees
GROUP BY department_id;

Hasilnya memiliki satu baris untuk setiap department_id berbeda yang ditemukan employees. Anda akan mendapatkan 5 baris: satu untuk masing-masing dari 4 departemen (1, 2, 3, 4) ditambah satu untuk NULL (Andrea Costa).

Dengan GABUNG untuk nama yang dapat dibaca

Seringkali Anda ingin mengelompokkan berdasarkan department_id tetapi menunjukkan namanya departemen. Anda menggabungkan GROUP BY dengan JOIN:

SQL
SELECT d.name AS department,
       COUNT(*)    AS count,
       AVG(e.salary) AS average_salary
FROM   employees   AS e
JOIN   departments AS d ON e.department_id = d.id
GROUP BY d.name
ORDER BY count DESC;

Ini adalah kueri intelijen bisnis lengkap: dalam tiga baris memberi tahu Anda berapa banyak karyawan yang dimiliki setiap departemen dan berapa penghasilan mereka rata-rata, diurutkan dari yang terbesar hingga yang terkecil.

Aturan emas

Saat Anda menggunakan GROUP BY, setiap kolom di SELECT harus:

  1. salah satu kolom pengelompokan (misalnya department_id, d.name), atau
  2. di dalam fungsi agregat (misalnya AVG(salary), COUNT(*)).
SQL
-- ERROR: first_name is neither in GROUP BY nor inside an aggregate
SELECT department_id, first_name, AVG(salary)
FROM   employees
GROUP BY department_id;

PostgreSQL mengembalikan kesalahan eksplisit ("kolom harus muncul di GROUP BY klausa atau digunakan dalam fungsi agregat"). Ini adalah minggu-minggu awal yang umum kesalahan: jika melihatnya, berhentilah dan tanyakan pada diri sendiri "apa nilainya first_name untuk grup yang terdiri dari 3 orang?" — tidak ada jawaban tunggal, dan makanya mesinnya mati.

Cobalah

Latihan#sql.m3.l3.e1
Upaya: 0Memuat…

Untuk setiap departemen, hitung berapa banyak karyawan yang ada di dalamnya. Kembalikan dua kolom: nama departemen (nama departemen) dan jumlah karyawan. Satu baris per departemen.

Memuat editor…
Tunjukkan petunjuk

Gabungkan dengan COUNT(*) dan kelompokkan berdasarkan d.name. SELECT harus berisi hanya kolom pengelompokan dan agregat.

Solusi tersedia setelah 3 upaya

Tinjau latihan

Latihan#sql.m3.l3.e2
Upaya: 0Memuat…

Untuk setiap departemen (nama departemen), hitung gaji rata-rata (AVG(gaji)) karyawannya, diurutkan dari tertinggi hingga terendah.

Memuat editor…
Tunjukkan petunjuk

AVG(e.gaji) sebagai agregat, GROUP BY d.name, ORDER BY rata-rata DESC.

Solusi tersedia setelah 3 upaya