Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Cara Mengelompokkan Berdasarkan Tahun di SQL

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Masalah Halloween – Bagian 4

  2. Cara Memigrasikan Database ke Server Pengecer Anda

  3. T-SQL Selasa #65 :Mengajarkan Sesuatu yang Baru

  4. Pisahkan string dengan cara yang benar – atau cara terbaik berikutnya

  5. Operator Aritmatika SQL