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

Cách nhóm theo năm trong 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
  EXTRACT(year FROM transaction_date) AS year,
  SUM(money) AS money_earned
FROM data
GROUP BY EXTRACT(year FROM 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,
  EXTRACT(year FROM transaction_date) AS year,
  SUM(money) OVER(PARTITION BY EXTRACT(year FROM 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ả định rằng bạn không có year cột. Thay vào đó, bạn có cột với đầy đủ ngày tháng.

Đầu tiên, bạn cần truy xuất một năm kể từ ngày. Bạn có thể sử dụng EXTRACT(part FROM date) chức năng để làm điều đó. Trong trường hợp của bạn, bạn muốn trích xuất năm, vì vậy phần datayear . date là cột chứa ngày - transaction_date cột. Bạn nên đổi tên cột thành năm sau đó. Nếu bạn muốn tìm hiểu thêm về EXTRACT chức năng và cách truy xuất các phần khác nhau từ ngày tháng, bạn có thể tìm thấy nó tại đây.

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, 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 EXTRACT(year FROM transaction_date) hoặc đơn giản hơn, GROUP BY 1 (since EXTRACT(year FROM transaction_date) là cột đầu tiên.)

Nếu bạn muốn hiển thị nhiều cột hơn, bạn cần có 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 tính tổng cho mỗi năm, hãy sử dụng PARTITION BY EXTRACT(year FROM transaction_date) bên trong nó. Lưu ý rằng bạn chưa có cột năm khi tính tổng, vì vậy PARTITION BY year sẽ không hoạt động - bạn sẽ gặp lỗi 'column "year" does not exist' . Bạn có thể đọc thêm về các chức năng của cửa sổ trong bài viết nà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 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 ở đây, nơi chúng tôi giải thích nó. 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 có tên mới.

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 (tại đây: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. Giám sát và quản lý cơ sở dữ liệu nâng cao cho TimescaleDB

  2. Tạo một tập hợp hoặc trình tự không có vòng lặp - phần 1

  3. Mô hình dữ liệu nền tảng cho vay ngang hàng

  4. Cách tăng tốc truy vấn SQL

  5. Trình điều khiển ODBC của bạn có hỗ trợ nguồn dữ liệu người dùng không?