66 messaggi dal 08 febbraio 2007
Ho una tabella con 2 campi "Valore" e "Data"
e' possibile fare una vista o altro con il saldo in riga
es.

Valore Data Saldo
0 01/01/2010 0
+100 10/01/2010 +100
+20 20/01/2010 +120
-5 30/01/2010 +115

ecc ecc

Grazie a tutti
Modificato da mtugnoli il 14 dicembre 2010 10.33 -
103 messaggi dal 01 dicembre 2010
Una soluzione c'è adesso non ho tempo per buttarla giu.

Dimmi di quanti record potrebbe essere composta la tabella di valore/data ?
Dimmi che DB hai e come ti interfacci.
Modificato da nman il 14 dicembre 2010 10.27 -
66 messaggi dal 08 febbraio 2007
Beh, adesso pochi 300 circa, ma in costante crescita.

PS. Ho SQL Server 2008 e uso ADO.Net per creare pagine su web.

Grazie a presto
Modificato da mtugnoli il 14 dicembre 2010 11.30 -
2.193 messaggi dal 30 novembre 2001
eccoti lo script:
USE tempdb
GO

/* Definisco la tabella dbo.Importi */
CREATE TABLE dbo.Importi(
ImportoID int NOT NULL IDENTITY PRIMARY KEY,
Data datetime NOT NULL,
Importo money NOT NULL
)
GO

/* La popolo */
SET NOCOUNT ON
INSERT dbo.Importi VALUES('20050101', 100)
INSERT dbo.Importi VALUES('20050101', 200)
INSERT dbo.Importi VALUES('20050102', 100)
INSERT dbo.Importi VALUES('20050102', 500)
INSERT dbo.Importi VALUES('20050103', -150)
SET NOCOUNT OFF
GO

/* Query */
SELECT I1.Data, I1.Importo, SUM(I2.Importo) AS [Saldo Progressivo]
FROM dbo.Importi I1 LEFT JOIN dbo.Importi I2
ON I2.ImportoID <= I1.ImportoID
GROUP BY I1.Data, I1.Importo
ORDER BY I1.Data, I1.Importo
GO

salve,
chiccosimo wrote:
/* Query */
SELECT I1.Data, I1.Importo, SUM(I2.Importo) AS [Saldo Progressivo] FROM dbo.Importi I1 LEFT JOIN dbo.Importi I2
ON I2.ImportoID <= I1.ImportoID
GROUP BY I1.Data, I1.Importo
ORDER BY I1.Data, I1.Importo
GO

visto che ci siamo, ampliamo il discorso aggiungendo anche l'identificatore di riga ritornata, e valutiamo anche una subquery al posto della join, USE tempdb
GO
/* Definisco la tabella dbo.Importi */
CREATE TABLE dbo.Importi(
ImportoID int NOT NULL IDENTITY PRIMARY KEY,
Data datetime NOT NULL,
Importo money NOT NULL
)
GO
/* La popolo */
SET NOCOUNT ON
INSERT dbo.Importi VALUES('20050101', 100)
INSERT dbo.Importi VALUES('20050101', 200)
INSERT dbo.Importi VALUES('20050102', 100)
INSERT dbo.Importi VALUES('20050102', 500)
INSERT dbo.Importi VALUES('20050103', -150)
SET NOCOUNT OFF
GO
/* Query */
PRINT 'chiccosimo, JOIN con raggruppamento';
SELECT I1.Data, I1.Importo, SUM(I2.Importo) AS [Saldo Progressivo] FROM dbo.Importi I1 LEFT JOIN dbo.Importi I2
ON I2.ImportoID <= I1.ImportoID
GROUP BY I1.Data, I1.Importo
ORDER BY I1.Data, I1.Importo
GO
PRINT 'ci aggiungiamo anche un ordinamento di riga, che spesso piage  '; PRINT 'left join raggruppata';
WITH CTE AS (
SELECT ROW_NUMBER () OVER (ORDER BY i.Data, i.ImportoID) AS [r], i.ImportoID, i.Data, i.Importo
FROM dbo.Importi i
)
SELECT cur.r AS [Riga],
cur.Data, cur.Importo,
SUM(old.Importo) AS [Saldo]
FROM CTE cur
LEFT JOIN CTE old ON old.r <= cur.r
GROUP BY cur.r, cur.Data, cur.Importo
ORDER BY cur.r;
GO
PRINT 'sub query inline';
WITH CTE AS (
SELECT ROW_NUMBER () OVER (ORDER BY i.Data, i.ImportoID) AS [r], i.ImportoID, i.Data, i.Importo
FROM dbo.Importi i
)
SELECT cur.r AS [Riga],
cur.Data, cur.Importo,
(SELECT SUM(old.Importo) FROM CTE old WHERE old.r <= cur.r) AS [Saldo] FROM CTE cur
ORDER BY cur.r;
GO
DROP TABLE dbo.Importi;

saluti

Andrea Montanari (Microsoft MVP - SQL Server)
http://www.asql.biz - http://italy.mvps.org
http://www.hotelsole.com - http://www.hotelsolericcione.de

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.
Community
Ultimi messaggi
UTENTI ONLINE
In primo piano

I più letti di oggi

Media
In evidenza
MISC