Sql 光标创建
我有两张桌子: 特雷森-詹诺费率,数量Sql 光标创建,sql,database,sql-server-2012,cursor,Sql,Database,Sql Server 2012,Cursor,我有两张桌子: 特雷森-詹诺费率,数量 Rate (2, 5, 7) Qty (3, 7, 7) 临时JanOrg Pkid JanOrg FebOrg MarOrg 1 2 0 0 我必须做3次计算,3行在Tresent中进行计算 JanOrg = (JanOrg * Qty * Rate) / 100 然后,janorg的总数应在janorg下的临时表中更新 如此合乎逻辑 JanOrg = ((2 * 2 * 3) / 100) + ((2 * 5 *
Rate (2, 5, 7)
Qty (3, 7, 7)
临时JanOrg
Pkid JanOrg FebOrg MarOrg
1 2 0 0
我必须做3次计算,3行在Tresent中进行计算
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
通过此选择,您可以看到有问题的值-您认为这些值正确吗
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行都快得多,因为它使用游标或while循环来处理行……通过此选择,您可以看到有问题的值-您认为这些值正确吗
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行都要快得多,因为它使用游标或while循环来痛苦地处理行……我同意最好不用游标,但我相信问题的根源在于您的代码正在进行整数运算 试试这两个:
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)
我同意最好不要使用光标,但我相信问题的根源在于您的代码正在进行整数运算 试试这两个:
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)
这是用于哪个RDBMS的?请添加一个标记来指定您是在使用mysql、postgresql、sql server、oracle还是db2,或者完全使用其他东西。您应该尽量不要使用游标!那将是明智和高效的。。。。。诅咒者是魔鬼——无论何时何地,都要避开他们can@marc_s你能提供更多关于为什么游标如此糟糕的信息,以及替代方法吗?@Kupiakos:SQL是一个基于集合的系统-它与C、VB等过程语言有很大的不同,因为你不逐行或逐项进行操作,指定过程中的每一个步骤—要编写好SQL,您需要重新思考您的方法,并以基于集合的思维方式工作,只告诉SQL该做什么—而不是如何做—它自己会明白的,而且通常比你自己做的效率要高得多。@Kupiakos:请参阅关于这个主题的一篇非常优秀的文章-只要搜索基于SQL集的思考,你就会找到大量的资料来了解这是用于哪些RDBMS的?请添加一个标记来指定您是在使用mysql、postgresql、sql server、oracle还是db2,或者完全使用其他东西。您应该尽量不要使用游标!那将是明智和高效的。。。。。诅咒者是魔鬼——无论何时何地,都要避开他们can@marc_s你能提供更多关于为什么游标如此糟糕的信息,以及替代方法吗?@Kupiakos:SQL是一个基于集合的系统-它与C、VB等过程语言有很大的不同,因为你不逐行或逐项进行操作,指定过程中的每一个步骤—要编写好SQL,您需要重新思考您的方法,并以基于集合的思维方式工作,只告诉SQL该做什么—而不是如何做—它自己会明白的,而且通常比你自己做的效率要高得多。@Kupiakos:例如,请参阅和一篇关于这个主题的非常优秀的文章-只要搜索基于SQL集的思考,你就会找到大量的资料可供查看。谢谢你的回复,我在临时表格中添加了这些细节。问题是我需要进行计算和分析然后签入已包含此数据的名为estimates的表,如果存在相同itemid的数据,则我需要为相应的itemid更新此表,否则请为此itemid插入一个包含这些计算操作的新行Hey感谢您的响应我在临时表中添加了此详细信息我需要做的是计算,然后签入名为estimates的表,该表已包含此数据,如果存在相同itemid的数据,则我需要为相应的itemid更新此表,否则,请使用此itemid的这些计算操作插入新行