我有一个如下的临时表:
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。
我尝试但无法获得所需的输出。任何帮助!!!
答案 0 :(得分:0)
您似乎想要累计NotAdded
和Dividend
以及一些随机数。后者我无法帮助。
在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
以相关值开头。
答案 1 :(得分:0)
考虑到前面的行值,您可以使用COMPUTED
列LAG
函数来SUM
列。
仅针对您的基金和日期列OVER
。
使用主键是首选,但如果你没有,我想它现在就可以完成这项工作。
答案 2 :(得分:0)
假设这是一次性问题,而不是永久性问题。我基于以下链接提出了以下解决方案:
我将简要解释我所做的事情,然后你可以看看下面的代码。
首先,我创建了一个临时表来模拟你的临时表,只有一个更改,我插入一个标识(1,1)。这是计算部分所必需的。
然后我插入了第一行的“已知值”数据,基金类型为a(5000),第一种基金类型为b(2000)。
然后在临时表中有两个插入,第一个主表连接到自身,并将其NotAdded + Dividend + Notional值从第二个较高的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