Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 光标创建_Sql_Database_Sql Server 2012_Cursor - Fatal编程技术网

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的这些计算操作插入新行