2016-02-26 53 views
1

我有2個表:光標創建

Tresent-JanOrg(速度,數量)

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 
+0

哪個RDBMS是爲了這個?請添加一個標籤來指定您是使用'mysql','postgresql','sql-server','oracle'還是'db2' - 或者其他的東西。 –

+0

SQL SERVER 2012 – user5987950

+0

你應該嘗試** NOT **來使用遊標!這將是聰明和高效.....遊標是魔鬼 - **無論何時何地都可以避免它們** –

回答

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的值。

絕對沒有CURSORS的必需

一個單一的,非常簡單基於集合的聲明,所有這一切 - 所以比任何RBAR(行到痛苦的排)處理快得多與一個遊標或一個while循環....

+0

嘿感謝您的回覆我在臨時表中添加了這個細節 – user5987950

+0

事情是,我需要做的計算,然後檢查表名爲估計已經包含這些數據,並在情況下,如果相同的itemid數據存在,那麼我需要爲相應的itemid更新此表,否則,爲這個itemid插入一個包含這些計算操作的新行 – user5987950

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)