Cześć,
zrobiłem kursor który wylicza kolejno wartości dla zgrupowanych ID (ID_PODRZEDNE) wg. ID_GLOWNE. ID_GLOWNE zawsze jest najmniejsze w grupowaniu i zawsze ma wartość LP = 1 AND ID_GLOWNE = ID_PODRZEDNE.
Zarówno id_glowne jak i id_podrzędne są unikatowe (występują tylko raz w kolumnie ID_Podrzędne). Poniżej przyklad.
CREATE TABLE DBO.KURSOR (ID_GLOWNE INT, ID_PODRZEDNE INT,WARTOSC INT)
INSERT INTO DBO.KURSOR (ID_GLOWNE,ID_PODRZEDNE,WARTOSC)
VALUES
(999,999,5),
(999,1000,10),
(999,2000,20),
(999,3000,30),
(999,4000,30),
(999,5000,80),
(999,6000,40),
(1111,1111,15),
(1111,2222,15),
(1111,3333,50),
(1111,4444,70),
(1111,5555,20)
SELECT *,ROW_NUMBER() OVER (PARTITION BY ID_GLOWNE ORDER BY ID_PODRZEDNE ASC) LP
INTO #TABELA
FROM DBO.KURSOR
DECLARE KURSOR CURSOR FOR
SELECT * FROM #TABELA
--SELECT *,ROW_NUMBER() OVER (PARTITION BY ID_GLOWNE ORDER BY ID_PODRZEDNE ASC) FROM DBO.KURSOR
DECLARE @ID_GLOWNE INT
DECLARE @ID_PODRZEDNE INT
DECLARE @WARTOSC INT
DECLARE @LP INT
DECLARE @TABLE TABLE (ID_GLOWNE INT,ID_PODRZEDNE INT,WARTOSC INT, LP INT, WARTOSC_NOWA INT )
OPEN KURSOR
FETCH NEXT FROM KURSOR INTO @ID_GLOWNE,@ID_PODRZEDNE,@WARTOSC,@LP
WHILE @@FETCH_STATUS = 0
BEGIN
IF @LP = 1
BEGIN
INSERT INTO @TABLE (ID_GLOWNE ,ID_PODRZEDNE ,WARTOSC , LP , WARTOSC_NOWA)
VALUES (@ID_GLOWNE,@ID_PODRZEDNE,@WARTOSC,@LP,@WARTOSC)
END
IF @LP > 1
BEGIN
DECLARE @WARTOSC_NOWA INT
SET @WARTOSC_NOWA = (SELECT WARTOSC FROM #TABELA WHERE ID_GLOWNE = @ID_GLOWNE AND LP = @LP - 1)
INSERT INTO @TABLE (ID_GLOWNE ,ID_PODRZEDNE ,WARTOSC , LP , WARTOSC_NOWA)
VALUES (@ID_GLOWNE,@ID_PODRZEDNE,@WARTOSC,@LP,@WARTOSC - @WARTOSC_NOWA)
END
FETCH NEXT FROM KURSOR INTO @ID_GLOWNE,@ID_PODRZEDNE,@WARTOSC,@LP
END
CLOSE KURSOR
DEALLOCATE KURSOR
DROP TABLE #TABELA
SELECT * FROM @TABLE
Mój kod działa jednak przy większej ilości rekordów trochę zwalnia i tutaj moje pytanie czy ktoś ma pomysł na jakąś jego optymalizację, zauważyłem że bardzo spowalnia go ta linijka:
SET @WARTOSC_NOWA = (SELECT WARTOSC FROM #TABELA WHERE ID_GLOWNE = @ID_GLOWNE AND LP = @LP - 1)
Jednak nie mam pomysłu jak inaczej to rozwiązać. Za sugestie będę bardzo wdzięczny.