Sql server 更新临时表-tsql
我有一个临时工作表,我需要更新投资组合持有债券和现金的部门价值。目前在工作表中,我会将任何债券指定为“债券”,任何现金指定为“现金”。我在下面有一个示例表:Sql server 更新临时表-tsql,sql-server,tsql,sql-update,temp-tables,Sql Server,Tsql,Sql Update,Temp Tables,我有一个临时工作表,我需要更新投资组合持有债券和现金的部门价值。目前在工作表中,我会将任何债券指定为“债券”,任何现金指定为“现金”。我在下面有一个示例表: PortfolioID IssueClassification Sector Weight AAA 020 Bond 2.3 AAA 010 Cash 1.5 AAA 030
PortfolioID IssueClassification Sector Weight
AAA 020 Bond 2.3
AAA 010 Cash 1.5
AAA 030 Equity 1.5
AAA 030 Equity 5.5
AAA 030 Equity 10.0
BBB 010 Cash 7.0
BBB 030 Equity 1.5
BBB 030 Equity 2.5
因此,我想更新工作表的是,如果像上面的投资组合AAA同时持有债券和现金,我想将其部门改为“现金和债券”。然而,如果上述类似投资组合BBB只持有现金而不持有债券,则该行业应保持“现金”状态。如果一个投资组合持有债券但没有现金,那么该部门仍应改为“现金和债券”。我在插入到我的#工作台的过程中研究了开发此功能的方法,但这会使程序效率太低
因此,最终我希望我的上表如下所示:
PortfolioID IssueClassification Sector Weight
AAA 020 Cash and Bonds 2.3
AAA 010 Cash and Bonds 1.5
AAA 030 Equity 1.5
AAA 030 Equity 5.5
AAA 030 Equity 10.0
BBB 010 Cash 7.0
BBB 030 Equity 1.5
BBB 030 Equity 2.5
我不确定最能实现这一点的更新脚本。有什么帮助吗?像这样的东西可以解决您的问题:
SELECT PortfolioID, IssueClassification,
CASE
WHEN Sector = 'Cash' AND EXISTS (SELECT * FROM PortfolioTable WHERE PortfolioID = OuterTable.PortfolioID AND Sector = 'Bonds') THEN 'Cash and Bonds'
WHEN Sector = 'Bonds' THEN 'Cash and Bonds'
ELSE Sector
END, Weight
FROM PortfolioTable AS OuterTable
这将起作用,但我不能评论潜在的效率:
declare @a table (PortfolioID char(3),IssueClassification char(3),Sector varchar(93), Weight decimal (5,2))
insert into @a(PortfolioID,IssueClassification,Sector,Weight) values
('AAA','020','Bond', 2.3 ),
('AAA','010','Cash', 1.5 ),
('AAA','030','Equity', 1.5 ),
('AAA','030','Equity', 5.5 ),
('AAA','030','Equity', 10.0 ),
('BBB','010','Cash', 7.0 ),
('BBB','030','Equity', 1.5 ),
('BBB','030','Equity', 2.5 )
update a1
set Sector = CASE
WHEN Sector in ('Bond','Cash') AND
2 = (select COUNT(DISTINCT Sector) from @a a2 where a2.PortfolioID = a1.PortfolioID and Sector in ('Bond','Cash'))
THEN 'Cash and Bonds'
ELSE Sector
END
from @a a1
结果:
select * from @a
PortfolioID IssueClassification Sector Weight
----------- ------------------- ----------------------- ---------------------------------------
AAA 020 Cash and Bonds 2.30
AAA 010 Cash and Bonds 1.50
AAA 030 Equity 1.50
AAA 030 Equity 5.50
AAA 030 Equity 10.00
BBB 010 Cash 7.00
BBB 030 Equity 1.50
BBB 030 Equity 2.50
希望很容易阅读并确认它正在做我们想要做的事情-如果当前价值是现金或债券,并且如果我们可以在该表中找到同一投资组合的现金和债券,那么满足WHEN
条款,我们改变行业-否则我们就不做了
这可以简化为:
update a1
set Sector = CASE
WHEN 2 = (select COUNT(DISTINCT Sector) from @a a2 where a2.PortfolioID = a1.PortfolioID and Sector in ('Bond','Cash'))
THEN 'Cash and Bonds'
ELSE Sector
END
from @a a1
where a1.Sector in ('Bond','Cash')
如果这是唯一应用的转换,而顶部查询是对
扇区
的更改做出多个决策的更一般形式,那么它是有意义的。谢谢你。