Anda sering menemukan skenario di mana Anda harus menghitung total kuantitas yang berjalan.
Total berjalan mengacu pada jumlah nilai di semua sel kolom yang mendahului sel berikutnya di kolom tertentu.
Mari kita lihat contoh untuk memperjelasnya.
Seperti yang Anda lihat, baris ketiga kolom RunningAgeTotal berisi jumlah semua nilai dalam baris 1 hingga 3 kolom StudentAge, yaitu 14 + 12 + 13 =39.
Demikian pula, nilai 4 baris kolom RunningAgeTotal adalah 49, yang merupakan jumlah nilai dalam baris 1 hingga 4 kolom StudentAge.
Di SQL Server, klausa OVER dapat digunakan untuk menghitung total yang berjalan.
Mari kita jelajahi cara menggunakannya dengan bantuan contoh di bawah ini.
Contoh Sederhana Menghitung Total Menjalankan SQL
Mari buat beberapa data dummy sebelum benar-benar menulis kueri yang menghitung total berjalan.
Pertama, jalankan skrip berikut:
CREATE DATABASE School
GO
USE School
GO
CREATE TABLE Students
(
Id INT PRIMARY KEY IDENTITY,
StudentName VARCHAR (50),
StudentGender VARCHAR (50),
StudentAge INT
)
GO
INSERT INTO Students VALUES ('Sally', 'Female', 14 )
INSERT INTO Students VALUES ('Edward', 'Male', 12 )
INSERT INTO Students VALUES ('Jon', 'Male', 13 )
INSERT INTO Students VALUES ('Liana', 'Female', 10 )
INSERT INTO Students VALUES ('Ben', 'Male', 11 )
INSERT INTO Students VALUES ('Elice', 'Female', 12 )
INSERT INTO Students VALUES ('Nick', 'Male', 9 )
INSERT INTO Students VALUES ('Josh', 'Male', 12 )
INSERT INTO Students VALUES ('Liza', 'Female', 10 )
INSERT INTO Students VALUES ('Wick', 'Male', 15 )
Skrip ini membuat tabel Siswa dalam database Sekolah. Ada empat kolom dalam tabel:Id, StudentName, StudentGender, dan Student. Pernyataan INSERT menambahkan 10 catatan dummy ke database.
Untuk menghitung total sql yang berjalan, kita harus menggunakan klausa OVER dan menambahkan kolom yang ingin kita hitung totalnya. Skrip berikut menghitung total nilai yang berjalan di kolom StudentAge dan menambahkan hasilnya ke kolom RunningAgeTotal.
USE School
SELECT Id, StudentName, StudentGender, StudentAge,
SUM (StudentAge) OVER (ORDER BY Id) AS RunningAgeTotal
FROM Students
Dalam skrip di atas, pernyataan SELECT mengambil kolom StudentName, StudentGender, dan StudentAge bersama dengan kolom total yang berjalan, yaitu RunningAgeTotal. Fungsi SUM Aggregate menambahkan nilai ke kolom StudentAge dan klausa OVER menentukan bahwa penambahan harus dilakukan dalam bentuk total berjalan yang diurutkan oleh kolom Id. Output dari script di atas adalah sebagai berikut:
Menghitung Rata-Rata Menjalankan SQL
Anda dapat memodifikasi skrip di bagian terakhir untuk menghitung usia rata-rata lari semua siswa di tabel Siswa. Untuk melakukannya, jalankan skrip berikut:
USE School
SELECT Id, StudentName, StudentGender, StudentAge,
SUM (StudentAge) OVER (ORDER BY Id) AS RunningAgeTotal,
AVG (StudentAge) OVER (ORDER BY Id) AS RunningAgeAverage
FROM Students
Seperti yang Anda lihat, kami menggunakan fungsi agregat AVG untuk menghitung usia rata-rata semua siswa di kolom Usia Pelajar. Output dari script di atas terlihat seperti ini:
Lihatlah baris ketiga kolom RunningAgeAverage. Ini berisi nilai rata-rata dari 1 hingga 3 baris di kolom StudentAge, yaitu (14 + 12 + 13)/3 =13.
Total Menjalankan Partisi berdasarkan Nilai Kolom
Anda juga dapat menghitung total berjalan dengan mempartisi data dengan nilai dalam kolom tertentu. Misalnya, Anda dapat menghitung sql menjalankan total usia siswa, dipartisi berdasarkan jenis kelamin. Untuk melakukan ini, Anda harus menggunakan pernyataan PARTITION BY bersama dengan klausa OVER.
Perhatikan contoh berikut:
USE School
SELECT Id, StudentName, StudentGender, StudentAge,
SUM (StudentAge) OVER (PARTITION BY StudentGender ORDER BY Id) AS RunningAgeTotal
FROM Students
Satu-satunya perbedaan antara menghitung total berjalan untuk semua catatan dan menghitung total berjalan menurut gender adalah penggunaan klausa PARTITION BY StudentGender dalam tanda kurung setelah klausa OVER. Skrip di atas menghitung total berjalan untuk nilai di kolom StudentAge, dipartisi dengan nilai di kolom StudentGender. Outputnya terlihat seperti ini.
Sekarang, lihat empat nilai pertama di kolom RunningAgeTotal (Disorot dengan persegi panjang merah). Nilai-nilai ini adalah total lari siswa perempuan. Demikian pula, 6 baris terakhir (disorot dengan persegi panjang hijau) berisi total usia siswa laki-laki dalam tabel Siswa.
Masalah dengan OVER ketika Kolom memiliki Kolom Duplikat
Masalah muncul jika kolom dengan nilai duplikat digunakan dengan klausa OVER untuk menghitung total berjalan. Lihatlah kolom StudentAge. Elice, Edward, dan Josh semuanya memiliki umur yang sama, yaitu 12. Demikian pula Liana dan Liza juga memiliki nilai yang sama pada kolom StudentAge, yaitu 10.
Jika Anda mencoba menghitung total berjalan dengan menentukan kolom StudentAge dalam tanda kurung setelah klausa OVER, Anda akan melihat beberapa hasil yang aneh. Mari kita jalankan kueri ini:
USE School
SELECT Id, StudentName, StudentGender, StudentAge,
SUM (StudentAge) OVER (ORDER BY StudentAge) AS RunningAgeTotal
FROM Students
Output dari query di atas adalah sebagai berikut:
Di baris kedua kolom RunningAgeTotal, nilainya 29. Namun, seharusnya 19 karena baris 1 dan 2 kolom StudentAge masing-masing berisi 9 dan 10. Dalam hal ini, karena 2 dan 3 baris kolom StudentAge berisi nilai duplikat, yaitu 10, nilai untuk 2 baris kolom RunningAgeTotal dihitung dengan menambahkan 9, 10, dan 10. Demikian pula, untuk 3 baris kolom kolom RunningAgeTotal, nilai dari baris kedua yaitu 29 digunakan.
Demikian juga, jika Anda melihat 5 baris kolom RunningAgeTotal, nilainya adalah 76. Seharusnya 40 + 12 =52. Namun, karena 5, 6 dan 7 baris kolom StudentAge memiliki nilai duplikat, yaitu 12, total lari dihitung dengan menambahkan 40 + 12 + 12 + 12 =76. Total lari ini telah digunakan untuk baris 6 dan 7 dari kolom RunningAgeTotal karena baris 6 dan 7 dari kolom StudentAge berisi nilai duplikat sebagai baris 5.
Untuk menghindari situasi ini, Anda harus berhenti menggunakan kolom dengan nilai duplikat bersama dengan klausa OVER. Kolom Kunci Utama selalu merupakan pilihan yang baik untuk digunakan dengan klausa OVER karena hanya berisi nilai unik.
Baca Juga:
Mengelompokkan Data menggunakan Fungsi OVER dan PARTITION BY
Pelajaran menggunakan OVER dan PARTITION BY