2013-08-15 4 views
0

У меня есть временная рабочая таблица, в которой мне нужно обновить значение сектора, где портфель имеет облигации и денежные средства. В настоящее время в рабочей таблице я буду назначать что-либо, что является облигацией «Бонд», и все, что может быть «наличными». У меня есть пример в таблице ниже:Update temp table - 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 выше, он имеет только наличные деньги и без облигаций, тогда сектор должен оставаться «наличными». Если портфель должен был удерживать облигации, но без наличных, то сектор должен по-прежнему меняться на «Денежные средства и облигации». Я рассмотрел способы разработки этого при вставке в мою #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

Это будет работать, но я не могу комментировать потенциальную эффективность:

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.

+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