VAR v_target NUMBER;
EXEC :v_target := 10;
SELECT id,amount,(CASE WHEN total<=:v_target THEN amount ELSE :v_target - last_total END) AS selected_amount
FROM (
SELECT t.*
,SUM(amount) OVER(ORDER BY amount,id) as total
,SUM(amount) OVER(ORDER BY amount,id) - amount as last_total
FROM t_money t
)
WHERE total<=:v_target
OR total>:v_target
AND last_total<:v_target
ORDER BY total;
EXEC :v_target := 10;
SELECT id,amount,(CASE WHEN total<=:v_target THEN amount ELSE :v_target - last_total END) AS selected_amount
FROM (
SELECT t.*
,SUM(amount) OVER(ORDER BY amount,id) as total
,SUM(amount) OVER(ORDER BY amount,id) - amount as last_total
FROM t_money t
)
WHERE total<=:v_target
OR total>:v_target
AND last_total<:v_target
ORDER BY total;