Notwendigkeit, data aus einer Tabelle nach Minus mit einem Wert auszuwählen

Ich habe einen Tisch und einen einzigen Wert

Table 1 SNo Amount 1 100 2 500 3 400 4 100 Value: 800 

Jetzt will ich das Ergebnis aus der Tabelle ist Minus der Wert und schließlich

Ich möchte eine rollende Subtraktion haben, die den Wert 800 von Tabelle 1 den ersten Betrag subtrahiert und dann auf nachfolgende Zeilen anwendet. Z.B:

 for type-1 800 - 100 (Record1) = 700 700 - 500 (record2) = 200 200 - 400 (record3) = -200 

Die Tabellenaufzeichnungen beginnen ab dem datasatz 3 mit dem Bilanzwert Balance 200

 Table-Output SNo Amount 1 200 2 100 

das heißt, wenn Minus 800 in der ersten Tabelle die ersten 2 datasätze entfernt werden und im dritten Rekord 200 ist Balance

Solutions Collecting From Web of "Notwendigkeit, data aus einer Tabelle nach Minus mit einem Wert auszuwählen"

Der einfachste path, dies zu tun, wäre, ein laufendes Aggregat zu verwenden. In deinem ursprünglichen Beispiel hast du zwei Tische, und wenn dies der Fall ist, führe einfach eine Summe auf diesem Tisch, wie ich es im Unterselect mache und diesen Wert in der variables speichern, die ich @Sum erstellt habe.

Der CTE berechnet, was der Wert sein würde, da er für jeden datasatz zusammen addiert wird, und wird dann zu der Summe addiert, und dann hält die, die positiv sind.

Ich glaube, dass dies Ihrem Bedarf 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