0

2番目のレコードAFS_OH列(ForecastID = 23)を、AFS_ToProduce以下の最初のレコードの前の値(ForecastID = 22)で更新する必要があります。言い換えると、の2番目のレコード値ですAFS_OH = 307923

AFS_ToProduce < 0また、テーブル全体のこれらの値を更新する必要があるため、WHERE以下の句でわかるように、ForecastID番号はの基準に基づいて異なります。

以下の私のスクリプトは、次のレコードの代わりに同じレコード値を更新しています。ご協力いただきありがとうございます!

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
4

2 に答える 2

1

次の更新では、次の行に正の AFS_ToProduce がある場合、AFS_ToProduce の負の値が次の行に転送されます。そうでない場合、この行は無視されます。select top 1AFS_ToProduce が負の場合、Inner は前の行を取得します。そうでない場合、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

TEST はSql Fiddleにあります。

于 2012-05-05T14:18:47.010 に答える
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
于 2012-05-05T14:02:09.607 に答える