2016-07-08 47 views
6

Ben dengeler tablo için bu tablo yapıya sahiptir:Bu sorguyu özyinelemeli Sql Server'ı nasıl yapabilirim?

enter image description here

Ve bu görünümdür:

enter image description here

Ben de tutarlar tablo için bu yapıya sahiptir:

enter image description here

Th Tutarlar tablo için görünüm modu da:

Ben tutarlar Tablo belirli bir gün için bir miktar değerini almak gerekir her şeyden

enter image description here

İlk:

enter image description here

alıyorum bu sorgu ile Şu andaki 300 miktardır 07/07/2016. Bu rakamı elde ettikten sonra, Balances tablosu ile özyinelemeli bir sorgulama yapmam gerekiyor. Sonuç şu şekilde olmalıdır: bu nedir

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

mı? Bu sonuç, Tutar tablosundan 300 alarak elde edildi ve Denge tablosundaki her satır için: İlk satırdaki abstracAmount boş değilse, bu matematiksel hesaplamayı yapıyorum: denge = (300 - abstractAmount) boş ve addAmount sütun bu matematiksel hesaplama dengesini yaptığım değerleri var = (300 + addAmount) Satırların geri kalanında aynı şeyi yapıyorum ama hesaplama 300'de değil, son satır dengesinde: Örneğin: İlk satırda denge 400'dür çünkü addamount değeri bu şekilde hesaplanır: 300 + 100 = 400 İkinci satırda denge soyut olur çünkü soyutAmount boş değildir, bu yüzden son satırın denge değerini alırım. Bu hesaplamayı yap: 400 - 50 = 350. Ve satırların geri kalanı için aynı şey, sadece ilk sırada bal alır miktar tablosu için ance değeri.

Notlar: 1.
zaman abstractAmount değerleri çıkarır sütun ve addAmount kolon toplam değerleri.

  1. Her zaman bu sütunlardan biri (abstractAmount | addAmount) boş olacaktır.

  2. Yalnızca ilk satır, Tutar tablosunun matematiksel hesaplamasını yapmak için değeri alır, diğer satırlar satırın değerini alır.

Nasıl bu nihai sonucu alabilirim? :

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

Önerileri kabul ediyorum, teşekkürler.

cevap

3

Yineleme yerine pencere işlevlerini kullanabilirsiniz.

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

isnull(addAmount,0) - ISNULL(abstractAmount,0) sadece her satır için mutasyon: rows unbounded preceding üzerinde Daha spesifik bir miktar çalışan bir toplam (+ başlangıç ​​dengesini) alır. over (order by id rows unbounded preceding), toplamı geçerli satır ve önceki tüm satırları id öğesine göre kapsamaktadır.

Tablonun miktarını tablodan almak için, basitçe (300 ... yerine bir değer) veya biraz daha şık olan: (tutarı ... nerede seçeceğinize) sahip olabilirsiniz: tablosu: haç var

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' 

where olmadan katılmak, sen

+0

bu sorguya tutarlar tablo için miktar değerini (300) almak için başka bir sorgu eklemek doktorunun mı olası tüm dengeleri alacağı ?? –

+1

Elbette, –

+1

düzenlemesine bir örnek ekledim Etkilendim, cevabın anlaşılır ve anlaşılması kolay görünüyor, daha karmaşık bir şey yapmam gerektiğini düşündüm, yardımlarınız için çok teşekkürler. –