【问题标题】:Update temp table - tsql更新临时表 - tsql
【发布时间】:2013-08-15 14:18:11
【问题描述】:

我有一个临时工作表,我需要更新投资组合持有债券和现金的行业价值。目前在工作表中,我会将任何债券分配为“债券”,将任何现金分配为“现金”。我在下面有一个示例表:

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

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

【问题讨论】:

    标签: sql-server tsql sql-update temp-tables


    【解决方案1】:

    这可行,但我无法评论潜在的效率:

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

    【讨论】:

    • 有道理。谢谢你。
    【解决方案2】:

    这样的事情能解决你的问题吗:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-10
      • 1970-01-01
      • 2018-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-02
      相关资源
      最近更新 更多