2012-05-05 133 views
0

我需要從下面的第一條記錄更新第二個記錄AFS_OH列(ForecastID = 23),前一個AFS_ToProduce值(ForecastID = 22)。換句話說,第二個記錄值爲AFS_OH = 307923用以前的記錄中的數據更新SQL Server表記錄字段

此外,我需要更新整個表的這些值,所以我預測ID號將根據AFS_ToProduce < 0的標準而有所不同,因爲您會在我的WHERE子句中注意到。

下面的腳本正在更新相同的記錄值而不是以下記錄。謝謝你的幫助!

ForecastID  AFS_OH  AFS_ToProduce 
22    307923 -307923 
23      0  316602 

這裏是我的方法:

UPDATE FC_Test 
SET AFS_OH = (AFS_ToProduce * (-1)) 
FROM FC_Test S3 
INNER JOIN 
(
    SELECT S1.FORECASTID, S2.AFS_ToProduce AS AFS_OH 
    FROM FC_Test S1 
    LEFT OUTER JOIN 
    (
     SELECT * 
     FROM FC_Test 
    ) S2 
    ON S1.ForecastID = S2.ForecastID 
)S4 ON S3.ForecastID = S4.ForecastID 
WHERE AFS_ToProduce < 0 
+0

您使用的是什麼sql-server版本? – Arion

+0

SQL Server 2008 –

+0

您能澄清AFS_ToProduce <0的影響嗎?是否有想法找到最接近的前一行並將當前行的「AFS_ToProduce」值設爲負值,並將該絕對值用於「AFS_OH」值? – Thomas

回答

1

下面的更新將如果下次行有積極AFS_ToProduce AFS_ToProduce的負值轉移到下一行。如果不是,則該行將被忽略。 如果AFS_ToProduce爲負數,則內部select top 1將檢索前一行;如果不是,則會跳過fc_test中的當前行。這可以預測ForecastID中的空白。

update fc_test 
set AFS_OH = - fc2.AFS_ToProduce 
from fc_test 
cross apply 
(
    select fc2.AFS_ToProduce 
    from 
    (
    select top 1 
     fc2.AFS_ToProduce 
     from fc_test fc2 
    where fc2.ForecastID < fc_test.ForecastID 
    order by fc2.ForecastID desc 
) fc2 
    where fc2.AFS_ToProduce < 0 
) fc2 
where fc_test.AFS_ToProduce > 0 

測試這裏Sql Fiddle

+0

謝謝尼古拉!完美的作品! –

0

試試這個

DECLARE @tbl table (i int, p int) 

INSERT INTO @tbl (i,p) VALUES (1,1),(10,10),(11,11),(20,20) 

SELECT * FROM @tbl 

UPDATE t1 
SET t1.p=t2.p 
FROM @tbl t1 
    CROSS JOIN @tbl t2 
WHERE t2.i=(SELECT max(i) 
       FROM @tbl t 
       WHERE i<t1.i) 


SELECT * FROM @tbl