2016-03-19 45 views
0

更新專欄中,我有一個這樣的表中的數據:SQL Server 2012中 - 根據公式

RowNo Type Formula  Amount 
------------------------------------ 
    01  0     3000 
    02  0     2000 
    03  0     1000 
    04  1  01+02-03  

我試圖找到一種方法,通過公式基礎上,前值更新的最後一排的量行。

結果應該是這樣的:

RowNo Type Formula  Amount 
----------------------------------- 
    01  0     3000 
    02  0     2000 
    03  0     1000 
    04  1  01+02-03  4000 

能否請您提出一些解決方案?提前致謝!

+0

這是可悲的_not_一些SQL確實在甚至遠程直接的方式。 –

+0

如果公式對於每一行都是相同的,那麼可以使用窗口函數和LAG(....但是否則您需要使用遊標或客戶端庫 –

+1

@marc_s公式說明'3000 + 2000 - 1000' = 4000如果組件引用了行,請注意減號 –

回答

1

使用傑夫MODEN的CSV分流DelimitedSplit8K

-- Setup table for testing 
declare @tbl table 
(
    RowNo varchar(2), 
    Type int, 
    Formula varchar(10), 
    Amount int 
) 
-- sample data 
insert into @tbl select '01', 0, NULL, 3000 
insert into @tbl select '02', 0, NULL, 2000 
insert into @tbl select '03', 0, NULL, 1000 
insert into @tbl select '04', 1, '01+02-03', NULL 
insert into @tbl select '05', 1, '01-02+03', NULL 

-- Query 
select * 
from @tbl t 
    cross apply 
    (
     select Amt = sum (i.Amount * f.Opr) 
     from 
     (
      select ItemNumber, 
       Item = replace(replace(Item, '+', ''), '-', ''), 
       Opr = case when charindex('-', Item) > 0 then -1 else 1 end 
      from dbo.DelimitedSplit8K(replace(replace(Formula, '+', ',+'), '-', ',-'), ',') 
     ) f 
     inner join @tbl i on f.Item = i.RowNo 
    ) a 
where t.Type = 1 

/* Result : 
RowNo Type  Formula Amount  Amt 
----- ----------- ---------- ----------- ----------- 
04 1   01+02-03 NULL  4000 
05 1   01-02+03 NULL  2000 

(2 row(s) affected) 
*/ 
+0

謝謝!驚人的功能!我現在會測試它。 – smackdun

0

這可以在一個通用的方式用兩個整列(忽略任何PK),它看起來像下面創建第三個表來實現:

TargetRowID Operation 
------------------------- 
    01   1 
    02   1 
    03   -1 

加入此表的第一可用做以生成所需的結果。

+0

謝謝!這肯定可以得到結果,但我認爲它並沒有涵蓋所有的情況,因爲用戶會改變公式。我必須調整SP。 – smackdun