sql >> Databasteknik >  >> RDS >> Sqlserver

Behöver välja data från en tabell efter minus med ett värde

Det enklaste sättet att göra detta är att använda ett löpande aggregat. I ditt ursprungliga exempel hade du två tabeller, och om så är fallet kör du helt enkelt en summa på den tabellen som jag gör i undervalet och lagrar det värdet i variabeln jag skapade @Sum.

CTE beräknar vad värdet skulle vara när det läggs ihop för varje post, och läggs sedan till den beräknade summan och behåller sedan de som är positiva.

Jag tror att detta kommer att passa ditt behov.

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



  1. Postgres + Hibernate + Java UUID

  2. Lagrar en skottsekund i SQL Server 2008

  3. Skillnaden mellan Equi-Join och Inner-Join i SQL

  4. SQL Server tar bort millisekunder från datetime