我有两张桌子:
Tresent-JanOrg(Rate,Qty)
Rate (2, 5, 7)
Qty (3, 7, 7)
Temp(JanOrg)
Pkid JanOrg FebOrg MarOrg
1 2 0 0
我必须进行3次计算(Tresent中有3行)来计算
JanOrg = (JanOrg * Qty * Rate) / 100
然后应在janorg
下的临时表中更新janorg的总数逻辑上
JanOrg = ((2 * 2 * 3) / 100) + ((2 * 5 * 7) / 100) + ((2 * 3 * 7) / 100)))
我正在尝试在SQL Server 2012中使用游标,但它没有返回正确的结果
我可以建议更好的方法来执行这些计算,因为我尝试了以下代码:
OPEN complex_cursor
FETCH NEXT FROM complex_cursor INTO @rate, @qty
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE #temp
SET JANORG = (JANORG * @rate * @qty) / 100
FETCH NEXT FROM complex_cursor INTO @rate, @qty
END
CLOSE complex_cursor
DEALLOCATE complex_cursor
答案 0 :(得分:0)
使用此SELECT
,您可以看到有问题的值 - 您认为这些值是否正确?
SELECT
tjo.*, temp.JanOrg,
(1.0 * tjo.Rate * tjo.Qty * temp.JanOrg) / 100.0
FROM
dbo.TresentJanOrg tjo
CROSS APPLY
dbo.TempJanOrg temp
输出:
Rate Qty JanOrg (No column name)
------------------------------------
2 3 2 0.120000
5 7 2 0.700000
7 7 2 0.980000
如果你总结这三个值,你应该得到你想要的东西:
DECLARE @Result DECIMAL(10,4)
SELECT @result = SUM((1.0 * tjo.Rate * tjo.Qty * temp.JanOrg) / 100.0)
FROM dbo.TresentJanOrg tjo
CROSS APPLY dbo.TempJanOrg temp
SELECT @result
返回 1.8000 的值。
绝对没有需要的消费者
一个非常简单的基于集合的语句可以完成所有操作 - 并且比使用游标的任何 RBAR (逐行激动行)处理快得多或者一会儿......
答案 1 :(得分:0)
我同意最好在没有光标的情况下这样做,但我相信问题的根源在于您的代码正在进行整数数学运算。
试试这两个:
SELECT ((2 * 2 * 3) / 100) + ((2 * 5 * 7) / 100)+((2 * 3 * 7) / 100)
SELECT ((2.0 * 2.0 * 3.0) / 100.0) + ((2.0 * 5.0 * 7.0) / 100.0)+((2.0 * 3.0 * 7.0) / 100.0)
第一个返回0,第二个返回1.24。
如果您想要浮点数学,请确保所有值/变量都是浮点数。如果你有一个int变量,你可以强制转换。例如:
DECLARE @i int
SET @i = 2
SELECT 5.0 / CAST(@i AS float)