Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Cách phân nhóm theo năm trong T-SQL

Vấn đề:

Bạn muốn nhóm dữ liệu của mình theo năm.

Ví dụ I:

Một trong các cột trong dữ liệu của bạn là transaction_date . Nó chứa một ngày tháng. Bạn muốn nhóm tất cả dữ liệu của mình theo năm và tính tổng số tiền kiếm được mỗi năm.

Dữ liệu data bảng trông như thế này:

transaction_date tiền
2018-03-25 1700
2019-09-12 100
2018-07-14 1200
2018-01-05 400
2019-06-08 2000
2020-03-06 1500

Giải pháp 1 (hiển thị năm và số tiền kiếm được):

SELECT
  YEAR(transaction_date) AS year,
  SUM(money) AS money_earned
FROM data
GROUP BY YEAR(transaction_date);

Kết quả là:

năm money_earned
2020 1500
2019 2100
2018 3300

Giải pháp 2 (hiển thị đầy đủ ngày, năm và số tiền kiếm được trong năm tương ứng):

SELECT
  transaction_date AS transaction_date,
  YEAR(transaction_date) AS year,
  SUM(money) OVER(PARTITION BY YEAR(transaction_date)) AS money_earned
FROM data;

Kết quả là:

transaction_date năm money_earned
2018-03-25 2018 3300
2018-07-14 2018 3300
2018-01-05 2018 3300
2019-09-12 2019 2100
2019-06-08 2019 2100
2020-03-06 2020 1500

Thảo luận:

Trong ví dụ này, giả sử rằng bạn không có cột năm. Bạn có cột với đầy đủ ngày tháng và muốn truy xuất năm từ cột đó.

Để truy xuất một năm kể từ ngày trong SQL Server, bạn có thể sử dụng YEAR() hàm số. Đối số của hàm này phải là ngày - ở đây là transaction_date cột.

Nếu bạn muốn hiển thị năm và tổng số tiền kiếm được trong năm này, bạn có thể sử dụng GROUP BY . Cột được chọn đầu tiên là năm được trích từ ngày. Cột thứ hai là hàm tổng hợp SUM(money) . Khi kết thúc truy vấn, bạn cần có GROUP BY YEAR(transaction_date) . Do đó Giải pháp 1.

Nếu bạn muốn hiển thị nhiều cột hơn, bạn sử dụng chức năng cửa sổ (Giải pháp 2). Sau SUM(money) bạn viết OVER() và vì bạn muốn nhóm theo từng năm, hãy sử dụng PARTITION BY YEAR(transaction_date) bên trong nó. Lưu ý rằng bạn chưa có year khi đếm tổng, vì vậy PARTITION BY năm sẽ không hoạt động. Bạn có thể đọc thêm về các chức năng của cửa sổ tại đây.

Ví dụ II:

Một trong các cột trong dữ liệu của bạn là year . Bạn muốn nhóm tất cả dữ liệu của mình theo cột này và tính tổng số tiền kiếm được mỗi năm.

Dữ liệu data bảng trông như thế này:

năm tháng ngày tiền
2018 3 25 1700
2019 9 12 100
2018 7 14 1200
2018 1 5 400
2019 6 8 2000
2020 3 6 1500

Giải pháp 1 (hiển thị năm và số tiền kiếm được):

SELECT
  year,
  SUM(money) AS money_earned
FROM data
GROUP BY year;

Kết quả là:

năm money_earned
2020 1500
2018 3300
2019 2100

Giải pháp 2 (hiển thị năm, tháng, ngày và số tiền kiếm được trong năm tương ứng):

SELECT
  year,
  month,
  day,
  SUM(money) OVER(PARTITION BY year) AS money_earned
FROM data;

Kết quả là:

năm tháng ngày money_earned
2018 3 25 3300
2018 7 14 3300
2018 1 5 3300
2019 9 12 2100
2019 6 8 2100
2020 3 6 1500

Thảo luận

Trong ví dụ này, giả sử rằng bạn đã có year cột.

Nếu bạn chỉ muốn hiển thị năm và tổng số tiền kiếm được trong năm này, một GROUP BY đơn giản Là đủ. Nếu bạn không cảm thấy thoải mái với khái niệm GROUP BY, hãy xem phần chúng tôi giải thích ở đây. Bạn chỉ cần sử dụng hàm tổng hợp (tại đây:SUM ) với cột đúng và ở cuối truy vấn, bạn nhóm theo year . Bạn có thể đổi tên cột bằng AS từ khóa với một tên mới. Ngoài ra, nếu bạn muốn dữ liệu được sắp xếp theo năm, hãy sử dụng ORDER BY năm vào cuối truy vấn của bạn.

Nó phức tạp hơn nếu bạn cũng muốn hiển thị một số cột khác. Sau đó, bạn cần giải pháp bằng cách sử dụng chức năng cửa sổ (Giải pháp 2). Bạn nên sử dụng hàm tổng hợp với cột thích hợp (SUM(money) ) và viết OVER() mệnh đề sau đó. Trong mệnh đề này, bạn nên sử dụng PARTITION BY với cột mà bạn muốn nhóm. Đó là cách bạn nhận được:

SUM(money) OVER(PARTITION BY year)

Trong giải pháp này, bạn không sử dụng GROUP BY mệnh đề.

Bạn có thể đọc thêm về các chức năng của cửa sổ tại đây.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thống kê chờ Knee-Jerk:PAGELATCH

  2. Máy chủ được liên kết của Salesforce.com và sp_columns_ex

  3. Làm thế nào để tìm các hàng trùng lặp trong SQL?

  4. Trường hợp con cá trích đỏ ước tính hồng y

  5. Duy trì MAX (hoặc MIN) đang chạy được nhóm lại