将金额分配到 SQL Server 中的几行

Kod*_*dak 3 sql-server sql-server-2014

我有任意金额要花,比如说 1000 美元

我也有几十行,假设员工以他们的工资为一列

我如何按优先级顺序在员工之间分配 1000 美元的预算,以便他们每个人都获得工资列中的值,直到钱都花完?一旦预算全部用完,其余的员工就会剩下零。

Employee, Rank, Salary
John, 1, 500$
Anne, 2, 400$
Rob, 3, 300$
Bill, 4, 200$
Run Code Online (Sandbox Code Playgroud)

结果应该是:

John, 1, 500$, 500$
Anne, 2, 400$, 400$
Rob, 3, 300$, 100$    --Only 100 left in the budget
Bill, 4, 200$, 0$
Run Code Online (Sandbox Code Playgroud)

知道如何在没有光标的情况下做到这一点吗?

Mar*_*ith 6

这是一种方法。

CREATE TABLE #emp (Employee VARCHAR(10), Rank INT, Salary INT CHECK (Salary > 0));

INSERT INTO #emp
VALUES      ('John',1,500),
            ('Anne',2,400),
            ('Rob',3,300 ),
            ('Bill',4,200);

DECLARE @Budget INT = 1000;

WITH T1 AS
( SELECT  * ,
          running_total = SUM(Salary) OVER (ORDER BY Rank 
                                            ROWS BETWEEN UNBOUNDED PRECEDING 
                                            AND CURRENT ROW)
         FROM #emp ), 
T2 AS 
(
SELECT *, 
      prev_running_total = LAG(running_total) OVER (ORDER BY Rank)
FROM T1
)
SELECT   Employee,
         Rank,
         Salary,
         CASE
             --run out
             WHEN prev_running_total >= @Budget THEN 0
             --budget left but not enough for whole salary
             WHEN running_total > @Budget THEN @Budget - prev_running_total 
             --Can do full amount 
             ELSE Salary
         END
FROM     T2;

DROP TABLE #emp 
Run Code Online (Sandbox Code Playgroud)