假设表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,并不是我正在寻找的。我测试过的大多数答案都只返回总量小于,而不是至少具体值的行。
答案 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)
SELECT *
FROM TableName t
CROSS APPLY (SELECT SUM(Amount)
FROM TableName
WHERE [Date] <= t.[DATE]) c(AmtSum)
WHERE AmtSum <= 13
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