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

Cara Mengelompokkan Berdasarkan Tahun di T-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 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Kiri Gabung

  2. Bersenang-senang dengan Fitur Postgres Baru Django

  3. Menggunakan ODBC dengan Salesforce dan OneLogin Single Sign On (SSO)

  4. Tidak ada bentuk caching basis data untuk mengurangi kueri basis data duplikat.

  5. Apa itu database?