sql >> Base de Datos >  >> RDS >> Sqlserver

Necesita seleccionar datos de una tabla después de menos con un valor

La forma más fácil de hacer esto sería usar un agregado en ejecución. En su ejemplo original, tenía dos tablas, y si este es el caso, simplemente ejecute una suma en esa tabla como lo estoy haciendo en la subselección y almacene ese valor en la variable que creé @Sum.

El CTE calcula cuál sería el valor a medida que se suma para cada registro, y luego se suma al total calculado, y luego se queda con los que son positivos.

Creo que esto se ajustará a su necesidad.

DECLARE @Sum INT;
SET @Sum = 800;

WITH    RunningTotals
          AS (
               SELECT   [SNo]
                      , [Amount]
                      , [Amount] + (
                                     SELECT ISNULL(SUM([Amount]), 0)
                                     FROM   [Table1] t2
                                     WHERE  t2.[SNo] < t.SNo
                                   ) [sums]
               FROM     [Table1] t
    ),
    option_sums
      AS (
           SELECT   ROW_NUMBER() OVER ( ORDER BY [SNo] ) [SNo]
                  , CASE WHEN ( [Sums] - @Sum ) > 0 THEN [Sums] - @Sum
                         ELSE [Amount]
                    END AS [Amount]
                  , sums
                  , [Amount] [OriginalAmount]
                  , [OriginalID] = [SNo]
           FROM     [RunningTotals] rt
           WHERE    ( [Sums] - @Sum ) > 0
         )
 SELECT [SNo]
      , CASE [SNo]
          WHEN 1 THEN [Amount]
          ELSE [OriginalAmount]
        END AS [Amount]
      , [OriginalID]
 FROM   option_sums 

SNo Amount  OriginalID
--- ------  ----------
1   200     3
2   100     4
3   100     5
4   500     6
5   400     7
6   100     8
7   200     9