Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Sie müssen Daten aus einer Tabelle nach Minus mit einem Wert auswählen

Der einfachste Weg, dies zu tun, wäre die Verwendung eines laufenden Aggregats. In Ihrem ursprünglichen Beispiel hatten Sie zwei Tabellen, und wenn dies der Fall ist, führen Sie einfach eine Summe für diese Tabelle aus, wie ich es in der Unterauswahl tue, und speichern Sie diesen Wert in der von mir erstellten Variablen @Sum.

Der CTE berechnet, was der Wert wäre, wenn er für jeden Datensatz addiert wird, und wird dann zur berechneten Gesamtsumme addiert, und behält dann die positiven.

Ich glaube, dass dies Ihren Anforderungen entspricht.

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