• Quick suggestion

    😎

    USE tempdb;

    GO

    SET NOCOUNT ON;

    DECLARE @test-2 TABLE

    (

    id int,

    knt INT,

    name VARCHAR(10),

    dugu decimal(18,2),

    potr decimal(18,2)

    )

    INSERT INTO @test-2(id,knt,name,dugu,potr)

    VALUES

    (1,2010001,'xxx',100, 0 ),

    (2,2010001,'yyy',70, 0 ),

    (3,2010001,'kkk',0, 60 ),

    (4,2010001,'aaa',40, 0 ),

    (5,2010001,'bbb',0, 70 ),

    (6,2010001,'ccc',0, 30 );

    ;WITH BASE_DATA AS

    (

    SELECT

    T.id

    ,T.knt

    ,T.name

    ,T.dugu

    ,SUM(T.potr) OVER

    (

    PARTITION BY (SELECT NULL)

    )

    -SUM(T.dugu) OVER

    (

    PARTITION BY (SELECT NULL)

    ORDER BY T.id

    ROWS BETWEEN UNBOUNDED PRECEDING

    AND CURRENT ROW

    ) AS RT_dugu

    FROM @test-2 T

    )

    SELECT

    BD.id

    ,BD.knt

    ,BD.dugu

    ,CASE

    WHEN BD.RT_dugu > 0 THEN BD.dugu

    WHEN BD.dugu > ABS(BD.RT_dugu) THEN (BD.dugu + BD.RT_dugu)

    WHEN BD.dugu <= ABS(BD.RT_dugu) THEN 0

    END AS covered

    ,CASE

    WHEN BD.RT_dugu >= 0 THEN 0

    WHEN BD.dugu > ABS(BD.RT_dugu) THEN ABS(BD.RT_dugu)

    WHEN BD.dugu < ABS(BD.RT_dugu) THEN BD.dugu

    END AS [not covered]

    FROM BASE_DATA BD

    WHERE BD.dugu > 0;

    Results

    id knt dugu covered not covered

    --- ----------- ------- --------- ------------

    1 2010001 100.00 100.00 0.00

    2 2010001 70.00 60.00 10.00

    4 2010001 40.00 0.00 40.00