2016-07-08 71 views
6

Ho questa struttura della tabella per la tabella Saldi:Come posso rendere questa query ricorsiva Sql Server?

enter image description here

E questa è la vista:

enter image description here

Ho anche tale struttura per la tabella importi:

enter image description here

Th è è la modalità di visualizzazione per la tabella importi:

enter image description here

Prima di tutto ho bisogno di ottenere il valore importo per un giorno specifico in Importi Tabella:

enter image description here

con questa query ottengo l'importo 300 in data 07/07/2016. Una volta raggiunta questa cifra, ho bisogno di fare una query ricorsiva con la tabella dei saldi. Il risultato finale dovrebbe essere simile a questo:

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

che cosa è questo? Questo risultato si ottiene prendendo il 300 dalla tabella Importi, e per ogni riga nella tabella Balance vedo: Se l'abstracAmount nella prima riga non è vuoto, faccio questo calcolo matematico: balance = (300 - abstractAmount), nel caso è vuoto e la colonna addAmount ha valori che eseguo questo bilancio di calcolo matematico = (300 + addAmount) Nel resto delle righe faccio lo stesso ma il calcolo non è su 300, è sull'ultimo bilancio delle righe: Ad esempio: Nella prima riga il saldo è 400 perché l'addamount ha valore quindi eseguo questo calcolo: 300 + 100 = 400 Nella seconda riga il saldo è 350 perché l'abstractAmount non è vuoto quindi prendo il valore di equilibrio per l'ultima riga e fare questo calcolo: 400 - 50 = 350. E la stessa cosa per il resto delle righe, solo la prima riga prende il bal valore di ance per la tabella degli importi.

Note:
1. Sempre colonna abstractAmount sottrae valori, ei valori di somma delle colonne addAmount.

  1. Sempre una di queste colonne (abstractAmount | addAmount) sarà vuota.

  2. Solo la prima riga prende il valore per eseguire il calcolo matematico per la tabella Importi, il resto delle righe assume il valore per la riga precedente.

Come posso ottenere questo risultato? :

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

Accetto suggerimenti, grazie.

risposta

3

Invece di ricorsione, è possibile utilizzare le funzioni della finestra.Più in particolare una somma sopra rows unbounded preceding per ottenere un totale parziale (+ l'equilibrio di partenza):

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

Il isnull(addAmount,0) - ISNULL(abstractAmount,0) è semplicemente la mutazione per ogni riga. Lo over (order by id rows unbounded preceding) scopre la somma della riga corrente e tutte le righe precedenti in base all'id.

Per ottenere la base dalla tabella degli importi, è possibile avere semplicemente il valore (selezionare ... dove data ..) come valore invece di "300" o un po 'più elegante: con un cross join agli importi tabella:

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' 

con la croce si uniscono senza la where, si otterrebbe tutti i possibili equilibri

+0

E' posible per aggiungere a questa domanda un'altra query per ottenere il valore dell'importo (300) per la tabella quantità ?? –

+1

Certo, ho aggiunto un esempio nella modifica –

+1

Sono impressionato, la tua risposta sembra molto chiara e semplice da capire, ho pensato che dovevo fare qualcosa di più complesso, grazie mille per il tuo aiuto. –