Mencari Nilai Maksimum Per Kategori SQL

Salah satu masalah paling umum yang melibatkan query database adalah mencari nilai terbesar/terkecil pada tiap kategori/tipe. Sebagai contoh adalah mencari pencetak gol terbanyak pada masing-masing dari 4 klub teratas sepak bola Liga Inggris berikut ini.

Nama                    Klub           Gol
------------------------------------------
Sergio Agüero           Man City       23
Edin Džeko              Man City       14
Mario Balotelli         Man City       13
Wayne Rooney	        Man United     27
Javier Hernández        Man United     10
Robin Van Persie        Arsenal        30
Emmanuel Adebayor       Tottenham      17
Jermain Defoe           Tottenham      11
Rafael Van der Vaart    Tottenham      11

Berikut ini adalah hasil yang diinginkan.

Nama                    Klub           Gol
------------------------------------------
Robin Van Persie        Arsenal        30
Wayne Rooney	        Man United     27
Sergio Agüero           Man City       23
Emmanuel Adebayor       Tottenham      17

Untuk menghasilkan keluaran seperti di atas, paling tidak kita membutuhkan dua langkah. Mencari jumlah gol yang diinginkan, kemudian tampilkan field lainnya berdasarkan gol yang sudah dicari tadi.

Langkah pertama adalah mencari gol terbanyak pada masing-masing klub tanpa melihat siapa pencetak golnya.

SELECT Klub, MAX(Gol) as maxGol 
FROM `skorer` 
GROUP BY Klub

Klub           maxGol
---------------------
Arsenal        30
Man City       23
Man United     27
Tottenham      17

Hasil bisa berbeda tergantung teknik penyortingan yang digunakan. Pada contoh di atas penyortingan menaik (ascending) berdasarkan field “Klub”.

Langkah kedua adalah menampilkan field sisanya (Nama) dengan cara menggabungkan table hasil query pertama dengan table mula-mula (skorer).

SELECT b.Nama, b.Klub, b.Gol
FROM (
  SELECT Klub, MAX(Gol) AS maxGol
  FROM `skorer` 
  GROUP BY Klub
) AS a
INNER JOIN `skorer` AS b ON 
  a.Klub = b.Klub AND a.maxGol = b.Gol

Nama                    Klub           Gol
------------------------------------------
Sergio Agüero           Man City       23
Wayne Rooney	        Man United     27
Robin Van Persie        Arsenal        30
Emmanuel Adebayor       Tottenham      17

Jika ingin diurutkan sesuai contoh, tinggal tambahkan ORDER BY Gol DESC pada akhir query.

Sebenarnya ada query yang lebih singkat untuk menampilkan hasil seperti di atas, yaitu dengan menggunakan sub-query untuk mencari gol terbanyak pada masing-masing klub.

SELECT * 
FROM `skorer`
WHERE Gol = (
  SELECT MAX(Gol) 
  FROM `skorer` AS a 
  WHERE a.Klub = skorer.Klub
)

About Sibudi

Ubuntu user | Loves books | Blogger | Web Developer | Learn PHP, JavaScript, Ruby & Python the hard way

03. August 2012 by Sibudi
Categories: SQL | Tags: , , | 3 comments

Comments (3)

  1. tutorialnya sangat membantu, terimakasih…
    saya punyak permasalahan hampir sama kayak tutorial diatas tp karna sy masih baru jadi masih banyak errornya.

    saya mau menampilkan jumlah penduduk pada tiap kecamatan dimana data yang muncul berdasarkan bulan terrakhir, sy mempunyai 2 tabel yakni tabel kecamatan,dan wni.

    kecamatan
    idkec | namakec
    1 | A
    2 | B
    3 | C

    wni
    id | idkec | jml | bln | thn
    1 | 1 | 10 | 2 | 2013
    2 | 2 | 8 | 2 | 2013
    3 | 3 | 5 | 2 | 2013
    4 | 1 | 9 | 3 | 2013
    5 | 3 | 7 | 3 | 2013
    6 | 2 | 6 | 4 | 2013

    hasil yang di inginkan
    idkec | namakec | jml | bln | thn
    1 | A | 9 | 3 | 2013
    2 | B | 6 | 4 | 2013
    3 | C | 7 | 3 | 2013

  2. Wah, tutorialnya sangat membantu gan buat bikin tugas ane…:D
    Thanks gan, thanks udh sharing…:)

  3. makasih banyak tutorialnya..

Leave a Reply

Required fields are marked *