Implementasi Algoritma Greedy Untuk Rekomendasi Item Belanja Kedalam SQL

Jhonatan Tjahjadi
5 min readJun 29, 2023

SQL (Structured Query Language) adalah bahasa pemrograman yang digunakan untuk mengelola dan mengambil data dari basis data relasional. Dalam konteks rekomendasi pembelian barang, SQL dapat digunakan untuk mengumpulkan data pelanggan, termasuk riwayat pembelian, preferensi produk, dan informasi keuangan seperti budgeting. Tutorial ini menggunakan DBMS Ms SQL Server

Skema DB

Skema DB Dari Algoritma Greedy

Penjelasan Declare Variabel

Variabel dalam SQL Server memungkinkan kita untuk menyimpan, memanipulasi, dan menggunakannya dalam berbagai pernyataan SQL.

Penjelasan Variabel Declare
  1. Declare digunakan untuk menyatakan suatu variabel yang akan dibentuk
  2. Nama variabel digunakan untuk melakukan penamaan pada variabel setelah Declare
  3. Tipe data digunakan untuk pemberian tipe data pada nama variabel seperti INT,VARCHAR,MONEY,dll

Penjelasan Cursor

Cursor adalah sebuah objek dalam SQL Server yang berfungsi untuk melacak dan memanipulasi baris-baris data dalam suatu kumpulan data (misalnya, hasil dari sebuah query). Dengan menggunakan cursor, kita dapat melakukan perulangan baris demi baris dan melakukan operasi atau manipulasi data tertentu pada setiap baris.

Penggunaan cursor dapat bermanfaat dalam beberapa situasi, seperti:

  • Ketika kita perlu melakukan perulangan melalui hasil query dan melakukan operasi yang kompleks pada setiap baris.
  • Ketika kita perlu mengakses dan memanipulasi data secara baris demi baris dalam urutan tertentu.
  • Ketika kita perlu melakukan pemrosesan berulang-ulang pada sekelompok baris yang memerlukan keputusan dinamis berdasarkan kondisi tertentu.

Contoh penggunaan cursor

-- Mendeklarasikan cursor
DECLARE myCursor CURSOR FOR
SELECT column1, column2
FROM myTable

-- Membuka cursor
OPEN myCursor

-- Mendeklarasikan variabel untuk menyimpan data
DECLARE @col1 INT, @col2 VARCHAR(50)

-- Mengambil data dari cursor
FETCH NEXT FROM myCursor INTO @col1, @col2

-- Memproses data dalam loop
WHILE @@FETCH_STATUS = 0
BEGIN
-- Operasi yang diinginkan pada setiap baris
PRINT 'Value 1: ' + CONVERT(VARCHAR, @col1)
PRINT 'Value 2: ' + @col2

-- Mengambil baris data selanjutnya
FETCH NEXT FROM myCursor INTO @col1, @col2
END

-- Menutup cursor
CLOSE myCursor
DEALLOCATE myCursor

Penggunaan SQL untuk rekomendasi pembelian barang yang sesuai dengan budget customer dengan menggunakan cursor

  1. Melakukan reset pada tabel detail DetailGreedy dan HasilGreedy agar tidak menumpuk :
delete DetailGreedy
delete HasilGreedy

2. Melakukan declare variable pada cursor :

DECLARE @cat VARCHAR (15) 
DECLARE @rata int
DECLARE @i INT = 1
DECLARE @biaya INT = 40000
DECLARE @temp int = 0
DECLARE @temp2 int = 0
DECLARE @harga int
DECLARE @ID INT
DECLARE @nama VARCHAR (255)

3.Melakukan declare cursor filtering untuk melakukan filtering pada rata- rata per category agar sesuai dengan budget yang ditentukan oleh customer :

DECLARE filtering CURSOR FOR 
SELECT Category,avg(price) as rata FROM items
group by Category
order by rata asc
OPEN filtering
FETCH NEXT FROM filtering INTO @cat,@rata
WHILE @temp <= @biaya
BEGIN
if @temp+@rata > @biaya
begin
break;
end
set @temp = @temp+@rata
set @i += 1
iNSERT INTO HasilGreedy(ID_category) VALUES (@cat);
FETCH NEXT FROM filtering INTO @cat,@rata
END
CLOSE filtering
DEALLOCATE filtering

4. Melakukan declare cursor nilai untuk mengambil produk terendah dari setiap category yang telah dilakukan filtering sebelumnya :

DECLARE nilai CURSOR FOR 
select id_category
from HasilGreedy
open nilai
FETCH NEXT FROM nilai INTO @cat
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO DetailGreedy(ID,Nama_Item,price,Category)
select top 1 ID,item,price,Category
from items
where Category = @cat
order by price asc
FETCH NEXT FROM nilai INTO @cat
END
close nilai
DEALLOCATE nilai

5. Melakukan declare cursor tampil untuk melakukan print hasil dari 2 cursor sebelumnya :

DECLARE tampil CURSOR FOR 
SELECT *
FROM DetailGreedy
PRINT 'ID| Price | Category |Item'
PRINT '_____________________________'

OPEN tampil
FETCH NEXT FROM tampil INTO @id, @nama, @harga, @cat
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT CONVERT(VARCHAR(12), @id) + ' | ' + CONVERT(VARCHAR(12), FORMAT(@harga, 'N', 'en-us')) + ' | ' + @cat+ ' | ' + @nama
FETCH NEXT FROM tampil INTO @id, @nama, @harga, @cat
END
PRINT 'Knapsack = Rp.' + CONVERT(VARCHAR(12), FORMAT(@biaya, 'N', 'en-us'))
PRINT 'Hasil Perkiraan Rata-Rata = Rp.' + CONVERT(VARCHAR(12), FORMAT(@temp, 'N', 'en-us'))
SELECT @temp2 = SUM(price)
FROM detailgreedy
PRINT 'Hasil Detail Item = Rp.' + CONVERT(VARCHAR(12), FORMAT(@temp2, 'N', 'en-us'))
CLOSE tampil
DEALLOCATE tampil

Berikut Full Source Code Dari Algoritma Greedy Menggunakan SQL

delete DetailGreedy
delete HasilGreedy
DECLARE @cat VARCHAR (15)
DECLARE @rata int
DECLARE @i INT = 1
DECLARE @biaya INT = 40000
DECLARE @temp int = 0
DECLARE @temp2 int = 0
DECLARE @harga int
DECLARE @ID INT
DECLARE @nama VARCHAR (255)
DECLARE filtering CURSOR FOR
SELECT Category,avg(price) as rata FROM items
group by Category
order by rata asc

OPEN filtering
FETCH NEXT FROM filtering INTO @cat,@rata
WHILE @temp <= @biaya
BEGIN
if @temp+@rata > @biaya
begin
break;
end
set @temp = @temp+@rata
set @i += 1
iNSERT INTO HasilGreedy(ID_category) VALUES (@cat);
FETCH NEXT FROM filtering INTO @cat,@rata
END
CLOSE filtering
DEALLOCATE filtering

DECLARE nilai CURSOR FOR
select id_category
from HasilGreedy
open nilai
FETCH NEXT FROM nilai INTO @cat
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO DetailGreedy(ID,Nama_Item,price,Category)
select top 1 ID,item,price,Category
from items
where Category = @cat
order by price asc
FETCH NEXT FROM nilai INTO @cat
END
close nilai
DEALLOCATE nilai

DECLARE tampil CURSOR FOR
SELECT *
FROM DetailGreedy
PRINT 'ID| Price | Category |Item'
PRINT '_____________________________'

OPEN tampil
FETCH NEXT FROM tampil INTO @id, @nama, @harga, @cat
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT CONVERT(VARCHAR(12), @id) + ' | ' + CONVERT(VARCHAR(12), FORMAT(@harga, 'N', 'en-us')) + ' | ' + @cat+ ' | ' + @nama
FETCH NEXT FROM tampil INTO @id, @nama, @harga, @cat
END
PRINT 'Knapsack = Rp.' + CONVERT(VARCHAR(12), FORMAT(@biaya, 'N', 'en-us'))
PRINT 'Hasil Perkiraan Rata-Rata = Rp.' + CONVERT(VARCHAR(12), FORMAT(@temp, 'N', 'en-us'))
SELECT @temp2 = SUM(price)
FROM detailgreedy
PRINT 'Hasil Detail Item = Rp.' + CONVERT(VARCHAR(12), FORMAT(@temp2, 'N', 'en-us'))
CLOSE tampil
DEALLOCATE tampil

Contoh Hasil dari kode diatas adalah sebagai berikut dengan nilai maksimum sebesar Rp. 40.000.

Hasil Dari Algoritma Greedy

Author collaboration:

Padmavati Darma Putri Tanuwijaya

Jhonatan Laurensius T

Christopher Kevin H

Ryan Putranda K

--

--