Masalah:
Anda ingin mengelompokkan data Anda berdasarkan tahun.
Contoh I:
Salah satu kolom di data Anda adalah transaction_date
. Ini berisi tanggal. Anda ingin mengelompokkan semua data Anda berdasarkan tahun dan menghitung total uang yang diperoleh setiap tahun.
data
tabel terlihat seperti ini:
tanggal_transaksi | uang |
---|---|
25-03-2018 | 1700 |
12-09-2019 | 100 |
14-07-2018 | 1200 |
05-01-2018 | 400 |
08-06-2019 | 2000 |
06-03-2020 | 1500 |
Solusi 1 (menampilkan tahun dan uang yang diperoleh):
SELECT YEAR(transaction_date) AS year, SUM(money) AS money_earned FROM data GROUP BY YEAR(transaction_date);
Hasilnya adalah:
tahun | hasil_uang |
---|---|
2020 | 1500 |
2019 | 2100 |
2018 | 3300 |
Solusi 2 (menampilkan tanggal lengkap, tahun, dan uang yang diperoleh pada tahun yang bersangkutan):
SELECT transaction_date AS transaction_date, YEAR(transaction_date) AS year, SUM(money) OVER(PARTITION BY YEAR(transaction_date)) AS money_earned FROM data;
Hasilnya adalah:
tanggal_transaksi | tahun | hasil_uang |
---|---|---|
25-03-2018 | 2018 | 3300 |
14-07-2018 | 2018 | 3300 |
05-01-2018 | 2018 | 3300 |
12-09-2019 | 2019 | 2100 |
08-06-2019 | 2019 | 2100 |
06-03-2020 | 2020 | 1500 |
Diskusi:
Dalam contoh ini diasumsikan bahwa Anda tidak memiliki kolom tahun. Anda memiliki kolom dengan tanggal lengkap dan ingin mengambil tahun darinya.
Untuk mengambil satu tahun dari tanggal di SQL Server, Anda dapat menggunakan YEAR()
fungsi. Argumen dari fungsi ini harus berupa tanggal – di sini, transaction_date
kolom.
Jika Anda ingin menampilkan tahun dan total uang yang diperoleh pada tahun ini, Anda dapat menggunakan GROUP BY
. Kolom pertama yang dipilih adalah tahun yang diambil dari tanggal. Kolom kedua adalah fungsi agregat SUM(money)
. Di akhir kueri, Anda memerlukan GROUP BY
YEAR(transaction_date)
. Oleh karena itu Solusi 1.
Jika Anda ingin menampilkan lebih banyak kolom, gunakan fungsi jendela (Solusi 2). Setelah SUM(money)
Anda menulis OVER()
klausa dan, karena Anda ingin mengelompokkan setiap tahun, gunakan PARTITION BY YEAR(transaction_date)
di dalamnya. Perhatikan bahwa Anda belum memiliki year
kolom saat menghitung jumlah, jadi PARTITION BY
tahun tidak akan berhasil. Anda dapat membaca lebih lanjut tentang fungsi jendela di sini.
Contoh II:
Salah satu kolom dalam data Anda adalah year
. Anda ingin mengelompokkan semua data Anda menurut kolom ini dan menghitung total uang yang diperoleh setiap tahun.
data
tabel terlihat seperti ini:
tahun | bulan | hari | uang |
---|---|---|---|
2018 | 3 | 25 | 1700 |
2019 | 9 | 12 | 100 |
2018 | 7 | 14 | 1200 |
2018 | 1 | 5 | 400 |
2019 | 6 | 8 | 2000 |
2020 | 3 | 6 | 1500 |
Solusi 1 (menampilkan tahun dan uang yang diperoleh):
SELECT year, SUM(money) AS money_earned FROM data GROUP BY year;
Hasilnya adalah:
tahun | hasil_uang |
---|---|
2020 | 1500 |
2018 | 3300 |
2019 | 2100 |
Solusi 2 (menampilkan tahun, bulan, hari dan uang yang diperoleh pada tahun yang bersangkutan):
SELECT year, month, day, SUM(money) OVER(PARTITION BY year) AS money_earned FROM data;
Hasilnya adalah:
tahun | bulan | hari | hasil_uang |
---|---|---|---|
2018 | 3 | 25 | 3300 |
2018 | 7 | 14 | 3300 |
2018 | 1 | 5 | 3300 |
2019 | 9 | 12 | 2100 |
2019 | 6 | 8 | 2100 |
2020 | 3 | 6 | 1500 |
Diskusi
Dalam contoh ini diasumsikan bahwa Anda sudah memiliki year
kolom.
Jika Anda hanya ingin menampilkan tahun dan total uang yang diperoleh tahun ini, GROUP BY
sederhana cukup. Jika Anda tidak merasa nyaman dengan konsep GROUP BY, lihat di sini di mana kami menjelaskannya. Anda cukup menggunakan fungsi agregat (di sini:SUM
) dengan kolom yang benar dan di akhir kueri Anda mengelompokkan menurut year
. Anda dapat mengganti nama kolom menggunakan AS
kata kunci dengan nama baru. Juga, jika Anda ingin data diurutkan berdasarkan tahun, gunakan ORDER BY
tahun di akhir kueri Anda.
Ini lebih rumit jika Anda juga ingin menampilkan beberapa kolom lainnya. Maka Anda memerlukan solusi menggunakan fungsi jendela (Solusi 2). Anda harus menggunakan fungsi agregat dengan kolom yang sesuai (SUM(money)
) dan tulis OVER()
klausa setelahnya. Dalam klausa ini, Anda harus menggunakan PARTITION BY
dengan kolom yang ingin Anda kelompokkan. Begitulah cara Anda mendapatkan:
SUM(money) OVER(PARTITION BY year)
Dalam solusi ini, Anda tidak menggunakan GROUP BY
klausa.
Anda dapat membaca lebih lanjut tentang fungsi jendela di sini.