Visualizza la versione completa : Campo Somma Cumulativa
Ciao a tutti,
ecco il mio dilemma odierno!
Io ho una tabella di questo tipo:
ID ..... Qta .... QtaCumulativa
1 ...... 5 ........ 5
2 ...... 2 ........ 7
3 ...... 10 ...... 17
4 ...... 1 ........ 18
In pratica voglio avere una colonna che mi fa fa il SUM della colonna Qta, ma solo fino all'ID della riga in cui sono.
Ad occhio vedo che si potrebbe fare con una doppia query annidata, ma su tabelle corpose temo diventerebbe piuttosto lenta.
Qualcuno ha forse sottomano una bella StoredProcedure che fa questa cosa?
Se vi serve saperlo lavoro con MS SQL Server.
Grazie mille a chiunque saprà darmi qualche indicazione.
E BUON ANNO A TUTTI !!!
Lorenzo
Originariamente postato da keanu00
Ad occhio vedo che si potrebbe fare con una doppia query annidata
Tanto per la cronaca (e magari per aiutare qualcuno che invece ricerca questa soluzione), la struttura della query annidata rispecchia la seguente sintassi:
SELECT ID, Qta, (SELECT SUM(Qta) FROM Tabella AS T2 WHERE T2.ID<=T1.ID)
FROM Tabella AS T1
poi ovviamente si può complicare a piacere! ;)
Sarebbe opportuno fare dei test, ma ad occhio sia la query annidata che una stored procedure impiegherebbero, su molti dati, troppo tempo.
Quello che suggerirei io è utilizzare una tabella aggiuntiva (accessoria) con campi ID e CUMULATA da mettere in join con la tua tabella originaria.
Quindi metterei nei trigger della tabella di origine (UPDATE, INSERT e DELETE) l'aggiornamento della tabella accessoria.
Se viene eseguito una modifica su un dato ID basta aggiornare di conseguenza.
In questo modo hai sempre tutto aggiornato e ti basta un semplice join per la consultazione.
...bisogna provare
PS: io ho dato questa soluzione ipotizzando che questa tabella sia in continuo aggiornamento.
;)
Originariamente postato da grullo
Quello che suggerirei io è utilizzare una tabella aggiuntiva (accessoria) con campi ID e CUMULATA da mettere in join con la tua tabella originaria.
Quindi metterei nei trigger della tabella di origine (UPDATE, INSERT e DELETE) l'aggiornamento della tabella accessoria.
Ciao.
Questa è senza dubbio la soluzione più efficiente! Difatti diluisce il carico di lavoro nel tempo, un po' su ogni operazione.
Purtroppo nel mio particolare caso però non è vantaggiosa, perché il criterio di ordinamento e quindi di calcolo è più complesso di quello che ho mostrato nell'esempio (semplificato per non distogliere l'attenzione dal succo della domanda)
In questi giorni cmq ci ho lavorato su, e se servisse a qualcuno per il futuro ho fatto un cursore che mi prepara i dati in una tabella temporanea,
ecco a voi il codice! :)
"SET NOCOUNT ON
DECLARE @ArtBack varchar(21), @Articolo varchar(21), @QtaProgr float, @QtaSum as float
DECLARE curEvasione CURSOR LOCAL
FOR SELECT Item,QtaOK FROM EvasioneOrd
FOR UPDATE OF QtaEvad
OPEN curEvasione
FETCH NEXT FROM curEvasione
INTO @Articolo, @QtaProgr
SELECT @ArtBack = @Articolo
SELECT @QtaSum = 0
WHILE @@FETCH_STATUS = 0
BEGIN
IF @ArtBack = @Articolo
SELECT @QtaSum = @QtaProgr + @QtaSum
ELSE
BEGIN
SELECT @ArtBack = @Articolo
SELECT @QtaSum = @QtaProgr
END
UPDATE EvasioneOrd
SET QtaEvad = @QtaSum
WHERE CURRENT OF curEvasione
FETCH NEXT FROM curEvasione
INTO @Articolo, @QtaProgr
END
CLOSE curEvasione
DEALLOCATE curEvasione
"
vBulletin® v3.7.3, Copyright ©: 2000-2012, Jelsoft Enterprises Ltd.
Traduzione italiana Team: vBulletin-italia.it |