Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Besoin de sélectionner les données d'une table après moins avec une valeur

La façon la plus simple de le faire serait d'utiliser un agrégat en cours d'exécution. Dans votre exemple d'origine, vous aviez deux tables, et si tel est le cas, exécutez simplement une somme sur cette table comme je le fais dans la sous-sélection et stockez cette valeur dans la variable que j'ai créée @Sum.

Le CTE calcule ce que serait la valeur telle qu'elle est additionnée pour chaque enregistrement, puis est ajoutée au total calculé, puis conserve celles qui sont positives.

Je pense que cela répondra à vos besoins.

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