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 menurut 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 EXTRACT(year FROM transaction_date) AS year, SUM(money) AS money_earned FROM data GROUP BY EXTRACT(year FROM 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, EXTRACT(year FROM transaction_date) AS year, SUM(money) OVER(PARTITION BY EXTRACT(year FROM 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 year
kolom. Sebaliknya Anda memiliki kolom dengan tanggal lengkap.
Pertama, Anda perlu mengambil satu tahun dari tanggal tersebut. Anda dapat menggunakan EXTRACT(part FROM date)
berfungsi untuk melakukannya. Dalam kasus Anda, Anda ingin mengekstrak tahun, jadi part
adalah year
. date
adalah kolom yang berisi tanggal – transaction_date
kolom. Sebaiknya ganti nama kolom menjadi tahun setelahnya. Jika Anda ingin mempelajari lebih lanjut tentang EXTRACT
fungsi dan cara mengambil bagian yang berbeda dari tanggal, Anda dapat menemukannya di sini.
Jika Anda hanya 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 EXTRACT(year FROM transaction_date)
atau, lebih sederhana, GROUP BY 1 (since EXTRACT(year FROM transaction_date)
adalah kolom pertama.)
Jika Anda ingin menampilkan lebih banyak kolom, Anda memerlukan fungsi jendela (Solusi 2). Setelah SUM(money)
Anda menulis OVER()
klausa dan, karena Anda ingin menghitung jumlah untuk setiap tahun, gunakan PARTITION BY EXTRACT(year FROM transaction_date)
di dalamnya. Perhatikan bahwa Anda belum memiliki kolom tahun saat menghitung jumlah, jadi PARTITION BY year
tidak akan berfungsi – Anda akan mendapatkan kesalahan 'column "year" does not exist'
. Anda dapat membaca lebih lanjut tentang fungsi jendela di artikel ini.
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 ingin menampilkan tahun dan total uang yang diperoleh pada 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.
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 (di sini: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.