Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

È necessario selezionare i dati da una tabella dopo meno con un valore

Il modo più semplice per farlo sarebbe utilizzare un aggregato in esecuzione. Nel tuo esempio originale, avevi due tabelle e, in tal caso, esegui semplicemente una somma su quella tabella come sto facendo nella sottoselezione e memorizza quel valore nella variabile che ho creato @Sum.

Il CTE calcola quale sarebbe il valore quando viene sommato per ogni record, quindi viene aggiunto al totale calcolato e quindi mantiene quelli positivi.

Credo che questo soddisferà le tue esigenze.

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