光标创建

Cursor creation

我有 2 个 table:

Tresent-JanOrg(费率、数量)

Rate (2, 5, 7)
Qty  (3, 7, 7)

温度 (JanOrg)

Pkid JanOrg FebOrg MarOrg
1     2        0     0

我必须计算 3 次(Tresent 中的 3 行)才能计算

JanOrg = (JanOrg * Qty * Rate) / 100 

然后应在 janorg

下的临时 table 中更新 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,您可以看到有问题的值 - 您认为这些值正确吗?

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

Returns 值为 1.8000

绝对不需要光标

一个非常简单的 set-based 语句就可以完成这一切——而且比任何 RBAR 都快得多(逐行- agonizing-row) 用游标或 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)

第一个returns0,第二个returns1.24.

如果您需要浮点运算,请确保所有 values/variables 都是浮点数。如果你有一个 int 变量,你可以进行转换。例如:

DECLARE @i int
SET @i = 2
SELECT 5.0 / CAST(@i AS float)