2017-09-25 31 views
1

這是我的SQL代碼:如何將立即插入的行列插入批量插入中的下一列?

CREATE TABLE #tmp 
    (
     Id INT IDENTITY(1, 1) , 
     Amount MONEY , 
     Rate FLOAT , 
     NetAmount MONEY 
    ); 
CREATE TABLE #rate (Rate FLOAT); 
INSERT INTO #rate 
     (Rate) 
VALUES (1.2); 
    -- Rate - float 

INSERT INTO #rate 
     (Rate) 
VALUES (1.3 -- Rate - float 
     ); 

INSERT INTO #rate 
     (Rate) 
VALUES (1.5 -- Rate - float 
     ); 
DECLARE @Amount MONEY = 5000; 
INSERT INTO #tmp 
     (Amount , 
      Rate , 
      NetAmount 
     ) 
     SELECT @Amount , 
       r.Rate , 
       r.Rate * @Amount 
     FROM #rate AS r; 


SELECT * 
FROM #tmp AS t; 

DROP TABLE #rate; 
DROP TABLE #tmp; 

這是我的輸出:

Id   Amount    Rate     NetAmount 
----------- --------------------- ---------------------- --------------------- 
1   5000.00    1.2     6000.00 
2   5000.00    1.3     6500.00 
3   5000.00    1.5     7500.00 

我需要一個像這樣的輸出:

Id   Amount    Rate     NetAmount 
    ----------- --------------------- ---------------------- --------------------- 
    1   5000.00    1.2     6000.00 
    2   6000.00    1.3     7800.00 
    3   7800.00    1.5     11700.00 

正如你所看到的第一個量,接收5000.00作爲一個參數,然後是一個特定順序的定義費率列表。我需要乘以每一個費率,你可以在我的需求輸出中看到。第一個NetAmount成爲下一行的金額。

我想最好不使用遊標或while循環。

回答

0

只需添加Computed column,看到在輸出的魔法爲

CREATE TABLE #tmp 
    (
     Id INT IDENTITY(1, 1) , 
     Amount MONEY , 
     Rate FLOAT , 
     NetAmount AS Amount * Rate -- computed column 
    ); 
CREATE TABLE #rate (Rate FLOAT); 
INSERT INTO #rate 
     (Rate) 
VALUES (1.2); 
    -- Rate - float 

INSERT INTO #rate 
     (Rate) 
VALUES (1.3 -- Rate - float 
     ); 

INSERT INTO #rate 
     (Rate) 
VALUES (1.5 -- Rate - float 
     ); 
DECLARE @Amount MONEY = 5000; 
INSERT INTO #tmp 
     (Amount , 
      Rate 
      --, NetAmount 
     ) 
     SELECT @Amount , 
       r.Rate 
       --,r.Rate * @Amount 
     FROM #rate AS r; 


SELECT * 
FROM #tmp AS t; 

DROP TABLE #rate; 
DROP TABLE #tmp; 
0

你需要速度的累計產品這一點。但是,沒有內置的功能來實現這一點。您可以結合使用LOGEXP與累計SUM實現這一目標:

insert into #tmp (amount, rate, netamount) 
select lag(netamount, 1, @Amount) over (order by id) as amount, 
    rate, 
    netamount 
from (
    select id, 
     @amount * exp(sum(log(rate)) over (order by id)) as netamount, 
     rate 
    from #rate 
    ) t; 

這是假設你在費率表的ID列,訂購其中你想計算應用的速度和數量。 還記得,在RDBMS中沒有內在的順序。