需要在减去一个值后从一个表中选择数据

时间:2013-07-22 12:37:49

标签: sql-server sql-server-2005

我有一张桌子和一个单值

Table 1                
SNo           Amount     
 1              100         
 2              500         
 3              400         
 4              100 


 Value:  800

现在我希望表中的结果是减去值,最后是

我想进行滚动减法,即从表1的第一个数量中减去值800,然后将其应用于后续行。例如:

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

表格记录从记录3开始,余额值余额为200

Table-Output
SNo       Amount
 1         200
 2         100

表示如果第一个表中的减去800,则前两个记录将被删除,而第三个记录200中的是余额

1 个答案:

答案 0 :(得分:2)

最简单的方法是使用正在运行的聚合。在您的原始示例中,您有两个表,如果是这种情况,只需在该表上运行一个总和,就像我在子选择中一样,并将该值存储在我创建的变量@Sum中。

CTE计算每个记录加起来的值,然后将其加到计算的总数中,然后保留正数。

我相信这符合你的需要。

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