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