更新临时表-tsql



我有一个临时工作表,需要更新投资组合持有债券和现金的部门价值。目前在工作表中,我会将任何债券指定为"债券",将任何现金指定为"现金"。我有一个示例表如下:

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

我不确定最能实现这一点的更新脚本。有什么帮助吗?

这会起作用,但我不能评论潜在的效率:

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的更改做出多个决定。

这样的东西能解决你的问题吗:

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

最新更新