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
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".
-- 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:
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:
- salah satu kolom pengelompokan (misalnya
department_id,d.name), atau - di dalam fungsi agregat (misalnya
AVG(salary),COUNT(*)).
-- 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
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.
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
Untuk setiap departemen (nama departemen), hitung gaji rata-rata (AVG(gaji)) karyawannya, diurutkan dari tertinggi hingga terendah.
Tunjukkan petunjuk
AVG(e.gaji) sebagai agregat, GROUP BY d.name, ORDER BY rata-rata DESC.
Solusi tersedia setelah 3 upaya