我有一个临时工作表,我需要更新投资组合持有债券和现金的行业价值。目前在工作表中,我将任何债券分配为“债券”,任何现金都是“现金”。我有一个示例表:
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只持有现金而没有债券那么该部门应该仍然是“现金”。如果投资组合持有债券但没有现金,那么该部门仍应改为“现金和债券”。我已经研究了在插入到我的#worktable期间开发它的方法,但这会使程序效率太低。
所以最终我希望我的上表看起来像这样:
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
我不确定可以最好地实现此目的的更新脚本。有什么帮助吗?
答案 0 :(得分:0)
这样的事情会解决你的问题:
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
答案 1 :(得分:0)
这会有效,但我无法评论潜在的效率:
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')
如果这是唯一应用的转化,则顶部查询是一种更为通用的形式,可用于对Sector
的更改做出多项决策。