【发布时间】:2012-02-21 09:49:36
【问题描述】:
有没有办法减去一个变量并将该变量的剩余部分用于 MS-SQL 中的下一列
基本上我想要做的是减去某个值并开始按顺序播放 var1-3 中的值
之前:
ID|var1|var2|var3
1| 500| 100| 200
2| 800| 400| 300
3|1200|3200|2400
样本 1 - 减去 600 我会得到
ID|var1|var2|var3
1| 0| 0| 200
2| 800| 400| 300
3|1200|3200|2400
示例 2 - 减去 750 我会得到
ID|var1|var2|var3
1| 0| 0| 50
2| 800| 400| 300
3|1200|3200|2400
示例 3 - 减去 900 我会得到
ID|var1|var2|var3
1| 0| 0| 0
2| 700| 400| 300
3|1200|3200|2400
带有'0'的字段可以是'null'。
这是我尝试过的,但非常笨重:|
DECLARE @Amount DECIMAL(18,2) = 900
CREATE TABLE #table(ID [int] NULL, var1 decimal(18,2), var2 decimal(18,2), var3 decimal(18,2))
INSERT INTO #table (ID,var1,var2,var3) VALUES (1,500,100,200)
INSERT INTO #table (ID,var1,var2,var3) VALUES (2,800,400,300)
INSERT INTO #table (ID,var1,var2,var3) VALUES (3,1200,3200,2400)
DECLARE @CurrentRow INT
DECLARE @OrgAmount DECIMAL(18,2)
WHILE (SELECT SUM( ISNULL(var1,0)) + SUM( ISNULL(var2,0)) + SUM( ISNULL(var3,0)) FROM #table) != 0 AND @Amount != 0
BEGIN
SELECT TOP 1 @CurrentRow = ID FROM #table
WHERE var1 != 0 OR var2 != 0 OR var3 != 0
ORDER BY ID ASC
UPDATE #table
SET var1 = CASE WHEN var1 - @Amount < 0 THEN 0 ELSE var1 - @Amount END,
@OrgAmount = var1
WHERE @CurrentRow = ID
SET @Amount = CASE WHEN @Amount - @OrgAmount < 0 THEN 0 ELSE @Amount - @OrgAmount END
UPDATE #table
SET var2 = CASE WHEN var2 - @Amount < 0 THEN 0 ELSE var2 - @Amount END,
@OrgAmount = var2
WHERE @CurrentRow = ID
SET @Amount = CASE WHEN @Amount - @OrgAmount < 0 THEN 0 ELSE @Amount - @OrgAmount END
UPDATE #table
SET var3 = CASE WHEN var3 - @Amount < 0 THEN 0 ELSE var3 - @Amount END,
@OrgAmount = var3
WHERE @CurrentRow = ID
SET @Amount = CASE WHEN @Amount - @OrgAmount < 0 THEN 0 ELSE @Amount - @OrgAmount END
END
SELECT * FROM #table
DROP TABLE #table
感谢您的协助。
【问题讨论】:
-
我会竭尽全力避免在 sql 中这样做。
-
这闻起来像个糟糕的设计
-
Bulky 从未受到关注。这是一个电子表格操作。
标签: sql sql-server-2008 sql-server-2005 subtraction