2016-07-08 28 views
6

Tôi có cấu trúc bảng này cho bảng dư:Làm thế nào tôi có thể thực hiện truy vấn này Sql Server đệ quy?

enter image description here

Và đây là quan điểm:

enter image description here

Tôi cũng có cấu trúc này cho bảng khoản:

enter image description here

Th là được chế độ xem cho bảng khoản:

enter image description here

Trước hết tôi cần phải có được giá trị số tiền cho một ngày cụ thể trong khoản Bảng:

enter image description here

với truy vấn này tôi nhận được số tiền 300 vào ngày 07/07/2016. Sau khi đạt được con số này, tôi cần phải thực hiện một truy vấn đệ quy với bảng cân bằng. Kết quả cuối cùng phải như sau:

Name abstractAmount addAmount Balance 
    ----- -------------- --------- ------- 
    Josep      100  400  
    Maria  50      350 
    George      60   410 
    Julianne 25      385 

Đây là gì? Kết quả này đạt được lấy 300 từ bảng Số tiền, và cho mỗi hàng trong bảng Cân bằng, tôi thấy: Nếu abstracAmount trong hàng đầu tiên không trống, tôi tính toán toán học này: balance = (300 - abstractAmount), trong trường hợp trống và cột addAmount có các giá trị tôi thực hiện phép tính toán học này = (300 + addAmount) Trong phần còn lại của hàng tôi thực hiện tương tự nhưng tính toán không bằng 300, nằm trên số dư hàng cuối cùng: Ví dụ: Trong hàng đầu tiên, số dư là 400 vì số dư có giá trị nên tôi thực hiện phép tính này: 300 + 100 = 400 Trong hàng thứ hai, số dư là 350 vì abstractAmount không trống nên tôi lấy giá trị số dư cho hàng cuối cùng và thực hiện phép tính này: 400 - 50 = 350. Và điều tương tự cho phần còn lại của hàng, chỉ có hàng đầu tiên lấy bal giá trị ance cho bảng số lượng.

Ghi chú:
1. Luôn trừu tượng cộtTổng hợp trừ giá trị và giá trị tổng của cột addAmount.

  1. Luôn một trong các cột này (abstractAmount | addAmount) sẽ trống.

  2. Chỉ hàng đầu tiên lấy giá trị để tính toán cho bảng Số tiền, phần còn lại của hàng lấy giá trị cho hàng trước đó.

Tôi có thể nhận kết quả cuối cùng này bằng cách nào? :

 Name  abstractAmount addAmount Balance 
     ----- -------------- --------- ------- 
     Josep      100  400  
     Maria  50      350 
     George      60   410 
     Julianne 25      385 

Tôi chấp nhận đề xuất, cảm ơn.

Trả lời

3

Thay vì đệ quy, bạn có thể sử dụng chức năng cửa sổ.Cụ thể hơn một số tiền trên rows unbounded preceding để có được một số hoạt động (+ sự cân bằng bắt đầu):

select *,300 + sum(isnull(addAmount,0) - ISNULL(abstractAmount,0)) over (order by id rows unbounded preceding) Balance 
from Balances 

Các isnull(addAmount,0) - ISNULL(abstractAmount,0) chỉ đơn giản là đột biến cho mỗi hàng. Các over (order by id rows unbounded preceding) phạm vi tổng cho hàng hiện tại và tất cả các hàng trước theo id.

Để lấy căn cứ từ bảng số lượng, bạn có thể chỉ đơn giản là có (chọn ... trong đó ngày ..) dưới dạng giá trị thay vì '300' hoặc tiện lợi hơn một chút: với sự tham gia chéo vào số tiền bảng:

select b.*, a.dateInsertion,a.amount, a.amount + sum(isnull(addAmount,0) - ISNULL(abstractAmount,0)) over (order by b.id rows unbounded preceding) Balance 
from Balances b 
cross join Amounts a 
where a.dateInsertion = '20160707' 

với chéo tham gia mà không có sự where, bạn sẽ nhận được toàn bộ số dư có thể

+0

là posible để thêm vào truy vấn này khác truy vấn để có được giá trị số tiền (300) cho bảng lượng ?? –

+1

Chắc chắn điều, thêm một ví dụ trong chỉnh sửa –

+1

Tôi rất ấn tượng, câu trả lời của bạn có vẻ rất rõ ràng và đơn giản để hiểu, tôi nghĩ tôi cần làm điều gì đó phức tạp hơn, cảm ơn bạn rất nhiều vì đã giúp đỡ bạn. –

Các vấn đề liên quan