Dalam SQL, SUM()
fungsi adalah fungsi agregat yang mengembalikan jumlah semua nilai dalam ekspresi yang diberikan.
Ini juga dapat digunakan untuk mengembalikan jumlah semua nilai (unik) yang berbeda dalam sebuah ekspresi.
Ekspresi harus numerik (tidak boleh berupa karakter string, bit string, atau datetime).
Berikut adalah beberapa contoh dasar untuk mendemonstrasikan cara kerjanya.
Tabel Contoh
Misalkan kita memiliki tabel berikut:
SELECT * FROM Products;
Hasil:
+-------------+------------+---------------------------------+----------------+-----------------------------------------+ | ProductId | VendorId | ProductName | ProductPrice | ProductDescription | |-------------+------------+---------------------------------+----------------+-----------------------------------------| | 1 | 1001 | Left handed screwdriver | 25.99 | Purple. Includes left handed carry box. | | 2 | 1001 | Long Weight (blue) | 14.75 | Includes a long wait. | | 3 | 1001 | Long Weight (green) | 11.99 | Approximate 30 minute waiting period. | | 4 | 1002 | Sledge Hammer | 33.49 | Wooden handle. Free wine glasses. | | 5 | 1003 | Chainsaw | 245.00 | Orange. Includes spare fingers. | | 6 | 1003 | Straw Dog Box | NULL | Tied with vines. Very chewable. | | 7 | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | Brown ceramic with solid handle. | | 8 | 1001 | Right handed screwdriver | 25.99 | Blue. Includes right handed carry box. | +-------------+------------+---------------------------------+----------------+-----------------------------------------+
Contoh
Kita dapat menggunakan kueri berikut untuk mendapatkan jumlah semua harga.
SELECT SUM(ProductPrice)
FROM Products;
Hasil:
+--------------------+ | (No column name) | |--------------------| | 367.20 | +--------------------+
Dalam hal ini, informasi harga disimpan di ProductPrice
kolom, jadi kami meneruskannya sebagai argumen ke SUM()
fungsi, yang kemudian menghitung jumlah dan mengembalikan hasilnya.
Menggunakan Alias Kolom
Anda akan melihat bahwa hasil sebelumnya tidak menyertakan nama kolom. Ini sudah diduga, karena SUM()
fungsi tidak mengembalikan kolom apa pun. Anda dapat dengan mudah memberikan nama kolom dengan menetapkan alias.
SELECT SUM(ProductPrice) AS Sum
FROM Products;
Hasil:
+--------+ | Sum | |--------| | 367.20 | +--------+
Hasil yang Difilter
SUM()
fungsi beroperasi pada baris yang dikembalikan oleh kueri. Jadi jika Anda memfilter hasilnya, hasil dari SUM()
akan mencerminkan hal itu.
SELECT SUM(ProductPrice) AS Sum
FROM Products
WHERE VendorId = 1001;
Hasil:
+-------+ | Sum | |-------| | 78.72 | +-------+
Dalam hal ini, 78,72 adalah jumlah dari semua produk yang ditawarkan oleh vendor tertentu.
NULL
Nilai
SUM()
fungsi mengabaikan NULL
nilai-nilai. Dalam tabel contoh kami di atas, nomor produk 6
telah mendapat NULL
dalam ProductPrice
kolom, tapi itu diabaikan di SUM()
. kami contoh.
Bergantung pada DBMS dan pengaturan Anda, Anda mungkin atau mungkin tidak melihat peringatan bahwa NULL
nilai dieliminasi dalam kumpulan hasil.
Berikut ini contoh yang mungkin Anda lihat:
SELECT SUM(ProductPrice) AS Sum
FROM Products;
Hasil:
+--------+ | Sum | |--------| | 367.20 | +--------+ Warning: Null value is eliminated by an aggregate or other SET operation.
Semua ini memberitahu kita bahwa kolom berisi setidaknya satu NULL
nilai, dan diabaikan saat menghitung hasil.
Data Tanggal/Waktu
SUM()
fungsi tidak menerima ekspresi tanggal/waktu.
Misalkan kita memiliki tabel berikut:
SELECT PetName, DOB
FROM Pets;
Hasil:
+-----------+------------+ | PetName | DOB | |-----------+------------| | Fluffy | 2020-11-20 | | Fetch | 2019-08-16 | | Scratch | 2018-10-01 | | Wag | 2020-03-15 | | Tweet | 2020-11-28 | | Fluffy | 2020-09-17 | | Bark | NULL | | Meow | NULL | +-----------+------------+
Jika kita mencoba menggunakan SUM()
pada DOB
kolom, kita akan mendapatkan kesalahan.
SELECT SUM(DOB) AS Sum
FROM Pets;
Hasil:
Msg 8117, Level 16, State 1, Line 1 Operand data type date is invalid for sum operator.
Data Karakter
SUM()
fungsi juga tidak menerima ekspresi string karakter.
Inilah yang terjadi jika kita mencoba menggunakan SUM()
pada ProductName
kolom Products
kami tabel (yang menggunakan tipe data varchar):
SELECT SUM(ProductName) AS Sum
FROM Products;
Hasil:
Msg 8117, Level 16, State 1, Line 1 Operand data type varchar is invalid for sum operator.
Yang DISTINCT
Kata kunci
Anda dapat menggunakan DISTINCT
kata kunci dengan SUM()
untuk menghitung hanya nilai yang berbeda. Artinya, jika ada nilai duplikat, mereka diperlakukan sebagai satu nilai.
Contoh:
SELECT SUM(DISTINCT ProductPrice) AS DistinctSum
FROM Products;
Hasil:
+---------------+ | DistinctSum | |---------------| | 341.21 | +---------------+
Kita dapat melihat bahwa hasil ini lebih rendah daripada hasil yang kita dapatkan tanpa DISTINCT
kata kunci.
Untuk rekap, kami mendapat 367,20 tanpa DISTINCT
kata kunci, dan 341.21 dengan DISTINCT
kata kunci.
Ini karena ada dua item yang memiliki harga yang sama (obeng kiri dan obeng kanan sama-sama dihargai 25,99). Oleh karena itu, SUM()
fungsi, bila digunakan dengan DISTINCT
kata kunci, memperlakukan kedua nilai tersebut sebagai satu, dan menghitung hasilnya sesuai dengan itu.
Fungsi Jendela
Bergantung pada DBMS Anda, Anda mungkin dapat menggunakan OVER
klausa dengan SUM()
. Anda fungsi untuk membuat fungsi jendela.
Fungsi jendela melakukan operasi seperti agregat pada sekumpulan baris kueri. Ini menghasilkan hasil untuk setiap baris kueri. Ini berbeda dengan operasi agregat, yang mengelompokkan baris kueri ke dalam satu baris hasil.
Berikut adalah contoh untuk mendemonstrasikan konsep tersebut.
Kami telah melihat Products
meja. Basis data kami juga memiliki Customers
tabel, dan berisi data berikut:
+--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+ | CustomerId | CustomerName | PostalAddress | City | StateProvince | ZipCode | Country | Phone | |--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+ | 1001 | Palm Pantry | 20 Esplanade | Townsville | QLD | 2040 | AUS | (308) 555-0100 | | 1002 | Tall Poppy | 12 Main Road | Columbus | OH | 43333 | USA | (310) 657-0134 | | 1003 | Crazy Critters | 10 Infinite Loops | Cairns | QLD | 4870 | AUS | (418) 555-0143 | | 1004 | Oops Media | 4 Beachside Drive | Perth | WA | 1234 | AUS | (405) 443-5987 | | 1005 | Strange Names Inc. | 789 George Street | Sydney | NSW | 2000 | AUD | (318) 777-0177 | | 1006 | Hi-Five Solutionists | 5 High Street | Highlands | HI | 1254 | AUS | (415) 413-5182 | +--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+
Kami dapat mengambil data dari tabel ini dan menyajikannya sebagai satu set hasil dengan menggunakan gabungan.
Kita juga dapat menggunakan SUM()
fungsi dengan OVER
klausa untuk menerapkan fungsi jendela ke data.
SELECT
v.VendorName,
p.ProductName,
p.ProductPrice,
SUM(ProductPrice) OVER (PARTITION BY v.VendorName) AS "Sum For This Vendor"
FROM Products p
INNER JOIN Vendors v
ON v.VendorId = p.VendorId
ORDER BY VendorName, ProductPrice, "Sum For This Vendor";
Hasil:
+---------------+---------------------------------+----------------+-----------------------+ | VendorName | ProductName | ProductPrice | Sum For This Vendor | |---------------+---------------------------------+----------------+-----------------------| | Katty Kittens | Bottomless Coffee Mugs (4 Pack) | 9.99 | 9.99 | | Mars Supplies | Long Weight (green) | 11.99 | 78.72 | | Mars Supplies | Long Weight (blue) | 14.75 | 78.72 | | Mars Supplies | Right handed screwdriver | 25.99 | 78.72 | | Mars Supplies | Left handed screwdriver | 25.99 | 78.72 | | Pedal Medals | Straw Dog Box | NULL | 245.00 | | Pedal Medals | Chainsaw | 245.00 | 245.00 | | Randy Roofers | Sledge Hammer | 33.49 | 33.49 | +---------------+---------------------------------+----------------+-----------------------+
Dalam hal ini kami menggunakan OVER
klausa dengan SUM()
. kami berfungsi untuk mempartisi hasil berdasarkan nama vendor.
Dengan melakukan ini, kami dapat mengembalikan informasi harga untuk setiap produk, serta jumlah semua produk dari vendor tersebut. Jumlahnya berubah saat vendor berubah (kecuali beberapa vendor kebetulan memiliki jumlah yang sama), tetapi tetap sama untuk semua produk dari vendor yang sama.
Konsep ini juga dapat diterapkan ke fungsi agregat lainnya di SQL, seperti AVG()
, MIN()
, MAX()
, dan COUNT()
.