达到值时停止求和

时间:2015-08-28 21:27:36

标签: sql-server database tsql

假设表1:

|PaymentID|CashAmount|
----------------------
|   P1    |      3000|
|   P2    |      5000|
|   P3    |      8000|
|   P4    |       700|
|   P5    |      5500|
|   P6    |      1900|

如果我想将CashAmount的总和设为'至少'9000. PaymentID订单应该是相同的。 预期成果:

|PaymentID|CashAmount|
----------------------
|   P1    |      3000|
|   P2    |      5000|
|   P3    |      8000|

如果我想将CashAmount的总和设为'至少'4000. PaymentID订单应该是相同的。 预期成果:

|PaymentID|CashAmount|
----------------------
|   P1    |      3000|
|   P2    |      5000|

我看了limiting the rows to where the sum a column equals a certain value in MySQL。但是接受的答案不适用于MSSQL,并不是我正在寻找的。我测试过的大多数答案都只返回总量小于,而不是至少具体值的行。

3 个答案:

答案 0 :(得分:2)

根据您的新输入,我略微改变了我的方法。希望这是你需要的......

编辑:这是SUM(x)OVER(...)的版本:

DECLARE @payment TABLE(PaymentID VARCHAR(10),CashAmount INT);
INSERT INTO @payment VALUES
 ('P1',3000)
,('P2',5000)
,('P3',8000)
,('P4',700)
,('P5',5500)
,('P6',1900);

DECLARE @myMinToReach INT=9000;

WITH SortedPayment AS
(
    SELECT ROW_NUMBER() OVER(ORDER BY PaymentID) AS inx  
          ,SUM(CashAmount) OVER(ORDER BY PaymentID) AS Summa
    FROM @payment
)
SELECT * FROM SortedPayment
WHERE inx<=(SELECT TOP 1 x.inx 
           FROM SortedPayment AS x
           WHERE Summa>@myMinToReach
           ORDER BY Summa ASC);

这是SQL-Server的旧版本&lt; 2012

DECLARE @payment TABLE(PaymentID VARCHAR(10),CashAmount INT);
INSERT INTO @payment VALUES
 ('P1',3000)
,('P2',5000)
,('P3',8000)
,('P4',700)
,('P5',5500)
,('P6',1900);

DECLARE @myMinToReach INT=4000;

WITH SortedPayment AS
(
    SELECT ROW_NUMBER() OVER(ORDER BY PaymentID) AS inx,*
    FROM @payment
)
,Accumulated AS
(
    SELECT tbl.*
    FROM
    (
        SELECT SortedPayment.*
              ,Accumulated.Summa
        FROM SortedPayment
        CROSS APPLY
        (
            SELECT SUM(ps2.CashAmount) AS Summa 
            FROM SortedPayment AS ps2 
            WHERE ps2.inx<=SortedPayment.inx 
        ) AS Accumulated
    ) AS tbl
)

SELECT * FROM Accumulated
WHERE inx<=(SELECT TOP 1 x.inx 
           FROM Accumulated AS x
           WHERE Summa>@myMinToReach
           ORDER BY Summa ASC);

答案 1 :(得分:2)

SQL Server 2005及更高版本

SELECT * 
FROM TableName t 
        CROSS APPLY (SELECT SUM(Amount)
                    FROM TableName 
                    WHERE [Date]  <= t.[DATE]) c(AmtSum)
WHERE AmtSum <= 13

SQL Server 2012及更高版本

SELECT *
 FROM (
        SELECT *
             ,SUM(Amount) OVER (ORDER BY [Date], Amount) AmtSum
        FROM TableName 
      )t
WHERE AmtSum <= 13  

答案 2 :(得分:-1)

declare @s int;

update table set rc=row_count() over (order by date)


declare @i int;
set @i=1;

while @s<=12 or @i<100000
   set @s=@s+(select amount from table where rc=@i+1);
   set @i=@i+1;
end

// @s has at least 12