Group By, Having dan Aggregate function(sum, avg, max, min)
GROUP BY
- mengelompokkan record yang isinya sama
contoh 1: group_by sederhana
SELECT customer_id FROM payment GROUP BY customer_id;
- perintah diatas adalah mengelompokan berdasarkan customer_id yang sama
- jadi customer tersebut hanya akan ditampilkan 1x saja
- pada contoh ini perintah group by mirip perintah distinct
contoh 2: group by dengan aggregate function
SELECT customer_id, SUM (amount) AS total FROM payment GROUP BY customer_id;
contoh 3:
SELECT store_id, COUNT (customer_id) FROM customer GROUP BY store_id
perintah diatas adalah menampilkan store_id dan jumlah customer yang dimiliki setiap store tersebut
HAVING
setelah dikelompokkan dan ditotal nilai tertentu dengan aggregate function
hasil totalnya dapat difilter,tapi untuk memfilter hasil aggregate function tidak dengan perintah where
tapi dengan perintah HAVING.SELECT customer_id, SUM (amount) AS total FROM payment GROUP BY customer_id HAVING SUM (amount) > 200;
Gabungan Group by, Having dan aggregate functin
misalnnya dari tabel payment kita ingin menampilkan customer_id dan jumlah yang dibayar (amount) tapi dengan syarat customer_id antara 100 - 200 dan nilai totalnya harus lebih besar 100
SELECT customer_id, SUM (amount) AS total FROM payment WHERE customer_ID >= 100 AND customer_id <=200 GROUP BY customer_id HAVING sum(AMOUNT) > 100 ORDER BY sum(AMOUNT) DESC ;
pada perintah diatas, id dari customer di kelompokkan sedang nilai amountnya di total
aggregate function yang dapat digunakan SUM,AVG,MAX,MIN,COUNT
- SUM = total Nilai, AVG = Rata-rata, MAX = Tertinggi, Min = Terendah, COUNT = jumlah data
perhatikan cara penulisan perintah WHERE harus ditulis sebelum Group by,
Sedangkan perintah Having harus ditulis setelah Group By, karena secara logika
hasil setelah dikelompokkan baru di filter lagi
Soal
- Tampilkan dari tabel payment, kolom staff_id,berapa kali mereka melayani customer (payment_id) lakukan dengan perintah group by
- Tampilkan dari tabel customer, kolom store_id dan jumlah customer yang dimiliki dengan syarat jumlah customernya yang melebihi 300
dari tabel customer customer memiliki address dan address memiliki city
diminta, tampilkan nama kota dan jumlah customer yang memiliki kota yang sama contoh sbb:
contoh dibawah berarti customer dari London ada 2city count London 2 Aurora 2 Sasebo 2 soal sama dengan soal ke 3 hanya diminta tampilkan customer dari country yang sama
country count Russian Federation 28 Greece 2 Latvia 2 United States 36 Spain 5 hitung ada berapa film yang memiliki kategori "Horror", kalau anda perhatikan pada sql dibawah ini dari praktek sebelumnya akan ditampilkan semua film dengan category Horror, tapi pada soal ini hanya diminta berapa jumlah film yang memiliki kategory horror.
contoh hasilnya
name jumlah_film Horror 56 coba tampilkan nama film dan jumlah sewa (perhatikan table film, inventory dan rental)
jumlah banyak disewa ada di kolom inventory_id di tabel rentaltampilkan 10 film yang paling banyak disewa sepanjang masa
tampilkan judul film category "Horror" yang paling banyak disewa
Jawaban
soal 1
SELECT staff_id, COUNT (staff_id) FROM payment GROUP BY staff_id;
soal 2
SELECT store_id, COUNT (customer_id) FROM customer GROUP BY store_id; HAVING COUNT (customer_id) > 300;
soal 3
SELECT c.city, count(cu.customer_id) FROM customer cu INNER JOIN address a ON cu.address_id = a.address_id INNER JOIN city c ON c.city_id = a.city_id GROUP BY c.city_id HAVING COUNT (cu.customer_id) > 1;
soal 4
SELECT co.country, count(cu.customer_id) FROM customer cu INNER JOIN address a ON cu.address_id = a.address_id INNER JOIN city c ON c.city_id = a.city_id INNER JOIN country co ON c.country_id = co.country_id GROUP BY co.country_id HAVING COUNT (cu.customer_id) > 1;
soal 5
SELECT c.name, COUNT (f.film_id) as jumlah_film FROM film f INNER JOIN film_category fc ON f.film_id = fc.film_id INNER JOIN category c ON fc.category_id = c.category_id GROUP BY c.name HAVING c.name = 'Horror';
soal 6
SELECT f.title, COUNT(r.rental_id) as jumlah_sewa FROM film f INNER JOIN inventory i ON f.film_id = i.film_id INNER JOIN rental r ON i.inventory_id = r.inventory_id GROUP BY f.title;
soal 7
SELECT f.title, COUNT(r.rental_id) as jumlah_sewa FROM film f INNER JOIN inventory i ON f.film_id = i.film_id INNER JOIN rental r ON i.inventory_id = r.inventory_id GROUP BY f.title ORDER BY jumlah_sewa DESC LIMIT 10;
soal 8
SELECT f.title, count (r.rental_id) as total_sewa FROM rental r INNER JOIN inventory i ON r.inventory_id = i.inventory_id INNER JOIN film f ON i.film_id = f.film_id INNER JOIN film_category fc ON fc.film_id = f.film_id INNER JOIN category c ON fc.category_id = c.category_id WHERE c.name = 'Horror' GROUP BY f.title ORDER BY total_sewa DESC;