对临时表进行 SQL 更新查询



我有一个临时表,如下所示:

Date    Fund  NotAdded    Dividend
1/1/2017    A     0           0
1/2/2017    A     0           0
1/3/2017    A   100           0
1/4/2017    A     0         200
1/5/2017    A    50          50
1/1/2017    B     0           0
1/2/2017    B   100           0
1/3/2017    B     0         200
1/4/2017    B     0           0

我想在上表上运行更新查询,我将得到如下结果:

Date      Fund  NotAdded    Dividend   Notional
1/1/2017    A     0           0         5000 (this value is known)
1/2/2017    A     0           0         5000
1/3/2017    A   100           0         5100
1/4/2017    A     0         200         5300
1/5/2017    A    50          50         5400
1/1/2017    B     0           0         2000
1/2/2017    B   100           0         2100  
1/3/2017    B     0         200         2300
1/4/2017    B     0           0         2300

对于每个基金,默认的名义价值是已知的。 即在上面的例子中,基金A为5000,基金B为2000。

我尝试但无法获得所需的输出。有什么帮助吗!!

您似乎想要NotAddedDividend的累积总和加上一些随机数。 后者我帮不上忙。

在 SQL Server 2012+ 中,您将使用累积求和函数。 在 SQL Server 2008 中,可以使用稍后的连接 (apply) 或相关的子查询:

select t.*,
(select sum(t2.NotAdded) + sum(t2.Dividend)
from #temp t2
where t2.fund = t.fund and
t2.date <= t.date
) as Cumulative
from #temp t;

您可以将"已知"值添加到累积中以获取最终值。

如果要将其作为更新:

update t
set notional = notional + 
(select sum(t2.NotAdded) + sum(t2.Dividend)
from #temp t2
where t2.fund = t.fund and
t2.date <= t.date
)
from #temp t;

这假定notional从相关值开始。

您可以使用带有LAG函数的COMPUTED列来SUM考虑前面的行值的列。

只需OVER您的"资金"和"日期"列。 最好使用主键,但如果你没有主键,我想它现在可以完成这项工作。

假设这是一次性问题而不是永久性问题。我根据以下链接提出了以下解决方案:

如何获得累计金额

我将简要解释我所做的事情,然后您可以查看下面的代码。

首先,我创建了一个临时表来模仿您的临时表,只需进行一次更改,我插入一个标识(1,1)。这是计算部分所必需的。

然后,我将您拥有的数据与"已知值"插入第一行,基金类型为 a (5000) 和第一个基金类型 b (2000)。

然后,在临时表中有两个插入,其中第一个主表连接到自身,并将其 NotAdd + 股息 + 名义值从第二个较高的 id(标识字段)一起添加到较低的 id。

之后,剩下要做的就是更新与 id 匹配的原始表。请参阅下面的代码。

--create temp table
DECLARE @TEMP TABLE 
(
[id] INT IDENTITY(1,1), 
[DATE] [datetime] NULL,
[Fund] [varchar](1) NULL,
[NotAdded] [int] NULL,
[Dividend] [int] NULL,
[Notional] [int] NULL   
)

--insert into temp table with first known value
INSERT INTO @TEMP ([DATE], [Fund], [NotAdded], [Dividend], Notional)
VALUES  ('1/1/2017','A',0,0,5000), --First value of A is known
('1/2/2017','A',0,0,0),
('1/3/2017','A',100,0,0),
('1/4/2017','A',0,200,0),
('1/5/2017','A',50,50,0),
('1/1/2017','B',0,0,2000), --First value of B is known
('1/2/2017','B',100,0,0),
('1/3/2017','B',0,200,0),
('1/4/2017','B',0,0,0)
--select into temp table for type a so that we can update the @temp table later 
SELECT T.id, T.Fund, T.NotAdded, T.Dividend, SUM(T2.NotAdded + T2.Dividend + T2.Notional)  AS Notional_Sum
INTO #TEMP_A
FROM @TEMP T 
INNER JOIN @TEMP t2 on T.id >= t2.id
AND T2.Fund = T.Fund
WHERE 1=1
AND T.Fund = 'A'
GROUP BY T.id, T.Fund,T.NotAdded, T.Dividend
ORDER BY T.id
--select into temp table for type b so that we can update the @temp table later 
SELECT T.id, T.Fund, T.NotAdded, T.Dividend, SUM(T2.NotAdded + T2.Dividend + T2.Notional)  AS Notional_Sum
INTO #TEMP_B
FROM @TEMP T 
INNER JOIN @TEMP t2 on T.id >= t2.id
AND T2.Fund = T.Fund
WHERE 1=1
AND T.Fund = 'B'
GROUP BY T.id, T.Fund,T.NotAdded, T.Dividend
ORDER BY T.id
--finally do updates
UPDATE T
SET T.Notional = TTS.Notional_Sum
FROM @TEMP T
INNER JOIN #TEMP_A TTS ON TTS.id = T.id
WHERE 1=1
UPDATE T
SET T.Notional = TTS.Notional_Sum
FROM @TEMP T
INNER JOIN #TEMP_B TTS ON TTS.id = T.id
WHERE 1=1

--select to view
SELECT  * FROM @TEMP
--drop temp tables
DROP TABLE #TEMP_A, #TEMP_B

最新更新