Hỏi Đáp SQL------------ Không có câu hỏi nào là sơ đẳng --------

Vấn đề liên quan đến tính liên tục

Giả sử bạn có bảng sau đây

 
Trường a  là nhóm, trường b có giá trị tăng dần ứng với mỗi nhóm, trường c là giá trị cần tính toán như số lượng, số tiền v.v. Bây giờ bạn muốn biểu thị dựa vào tính liên tục của trường b, ứng với mỗi nhóm của trường a, cho tổng số của trường c như sau


Kết quả bao gồm : nhóm dựa vào trường a, bắt đầu của trường b, kết thúc của trường b, và tổng số giá trị của trường c.
 
Vấn đề được giải quyết thế nào ?
 

 
Thoạt trông có vẻ phức tạp nhưng kỳ thực rất đơn giản. Khi vấn đề liên quan đến tính liên tục, bạn hãy nghĩ ngay đến giải pháp với hàm ROW_NUMBER().
 
Trước hết bạn sử dụng hàm ROW_NUMBER() để lập nhóm mới cho những dòng liên tục và những dòng không liên tục. Sau đó sử dụng các hàm thống kê cho chúng là xong.
 
Sau đây là toàn bộ mã cho bạn chay thử.
 
declare @bangTam table(a int, b int, c int)

insert into @bangTam values

(1,11,3),(1,1,1),(1,2,9),(1,3,2),(1,4,2),(1,7,1),(1,8,1),(1,10,6),

(2,1,7),(2,5,3),(2,6,7),(2,7,5),(2,11,6),(2,12,9),(2,13,2),(2,20,3)
 select * from @bangTam order by a, b

;with temp as(select *, rn = row_number() over(partition by a order by b) from @bangTam)

select a, min(b) BD, max(b) KT, sum(c) TS

from temp group by a, (b-rn) order by a, BD
 
 
Ở ví dụ này tôi sử dụng số cho tính liên tục, trong thực thế chúng có thể liên tục theo ngày, như ngày bán hàng v.v. Giải pháp có khác đôi chút, nhưng bản chất vẫn giống nhau.

1 nhận xét: