20 Januari 2013

Get First Record from 'Group By' on Query SQL Server

Jika diketahui record dari sebuah tabel 'identitas' seperti berikut:

NomorNama
1
Saya
1
Aku
2
Kamu
2
Anda
1
I'm

Kemudian yang ingin saya lakukan adalah menampilkan value/nilai berdasarkan pengelompokkan Nomor dan mengambil value Nama berdasarkan nilai yang pertama. Jadi yang akan tertampil adalah :

NomorNama
1
Saya
2
Kamu

Jika menggunakan query di MySQL kita bisa menggunakan query seperti berikut:

select No, Nama from identitas group by No

Query tersebut benar karena dalam MySQL akan mengambil nilai yang paling atas dalam group itu. Namun untuk query di SQL Server, query diatas akan mengalami error karena variabel selain yang di group (Nama) harus menggunakan agregasi (max, min, avg, sum).

Permasalahan yang ada adalah di dalam query SQL Server tidak ada fungsi agregasi yang memilih record pertama dari group. Logikanya jika mengandaikan terdapat fungsi untuk memilih record pertama yaitu 'first', maka query bisa dilakukan dengan cara berikut:

select No, first(Nama) from identitas group by No

Itu jika fungsi 'first' ada maka hasil query yang tertampil adalah:

NomorNama
1
Saya
2
Kamu

Tetapi, fungsi 'first' itu tidak ada. Mungkin hal ini dikarenakan fungsi 'first' memiliki manfaat yang tidak terlalu berguna sehingga tidak dibuatkan oleh Microsoft.

Tetapi bagaimana jika ingin mendapatkan nilai dari first tersebut? Dapat dilakukan dengan sedikit mengakali query dengan cara 'bodoh' seperti berikut:

select distinct No, (select top 1 Nama from identitas B where B.No = A.No) from identitas A

Dengan memakai fungsi projection menggunakan select seperti itu, maka akan dapat menghasilkan nilai pertama seperti pada group MySQL (walau dalam query tersebut tidak menggunakan group by, tetapi dengan menambahkan distinct).

 photo unsure1.gif

4 komentar:

  1. Tenkyu bro arip. ajaran anda sungguh membantu..

    BalasHapus
    Balasan
    1. haha sama-sama gan :D
      tapi sedapat mungkin jangan menggunakan cara ini, karena secara query sangat lama dan kurang optimal.. gunakan cara yang lebih optimal yang telah saya berikan kemarin, dengan menggunakan group by untuk mendapatkan ID (primary key), hihihi

      Hapus
  2. select * from vw_kdn_pkr t1
    where year(t1.tgl_daftar)='2013' and month(t1.tgl_daftar)='08'
    group by t1.kode_pkr
    keluar error kaya gini ya mas
    Msg 8120, Level 16, State 1, Line 1

    terima kasih..............

    BalasHapus
    Balasan
    1. kalau memakai group-ing fungsi selectnya gak bisa select *, karena harus menggunakan fungsi aggregation (max, min, avg, sum) - kecuali untuk field yang di-group itu sendiri

      misal:
      select t1.kode_pkr, max(field_1), min(field_2) from vw_kdn_pkr t1
      where year(t1.tgl_daftar)='2013' and month(t1.tgl_daftar)='08'
      group by t1.kode_pkr

      Hapus

Ayo kirim komentar, disini!!