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.