mssql cursor örneği Canlı Tablo Üzerinden Toplam 2000 TL'yi Aşmayacak Şekilde gruplama

ÖRNEK: Canlı Tablo Üzerinden Toplam 2000 TL'yi Aşmayacak Şekilde Gruplama

Varsayalım bu tablo zaten var:

-- Gerçek veri tablon
-- CREATE TABLE Tutarlar (
--     ID INT,
--     Tutar INT
-- );

-- Örnek amaçlı değer atayalım:
-- (Eğer tabloda veri varsa bu kısmı atla)
-- INSERT INTO Tutarlar (ID, Tutar) VALUES
-- (1, 100), (2, 200), (3, 500), (4, 1250), (5, 300), (6, 400), (7, 1000);

 

Cursor ile Sadece SELECT Sonuç Üretme

DECLARE @ID INT, @Tutar INT;
DECLARE @Toplam INT = 0;
DECLARE @GrupNo INT = 1;

-- Bellekte tutulacak sonuçlar için tablo değişkeni (diskte tablo yaratmaz!)
DECLARE @Sonuc TABLE (
    ID INT,
    Tutar INT,
    GrupNo INT
);

-- Cursor tanımı
DECLARE cur CURSOR FOR
    SELECT ID, Tutar FROM Tutarlar ORDER BY ID;

OPEN cur;
FETCH NEXT FROM cur INTO @ID, @Tutar;

WHILE @@FETCH_STATUS = 0
BEGIN
    IF (@Toplam + @Tutar) > 2000
    BEGIN
        SET @GrupNo = @GrupNo + 1;
        SET @Toplam = 0;
    END

    -- Sonuçları tabloya yaz (bellekte tutulur)
    INSERT INTO @Sonuc (ID, Tutar, GrupNo)
    VALUES (@ID, @Tutar, @GrupNo);

    SET @Toplam = @Toplam + @Tutar;

    FETCH NEXT FROM cur INTO @ID, @Tutar;
END

CLOSE cur;
DEALLOCATE cur;

-- Sonuçları göster
SELECT * FROM @Sonuc ORDER BY GrupNo, ID;