2012-01-25 91 views
1

我有选择,iside选择有2列。此列必须从相同的选择填充,但我不想使用选择两次。是否可以使用选择1次,然后从第一次设置第二列值? 例子:设定值从选择几个选择

insert into @temptable from 
select 
a = (select aa from table1 where quantity > 5) 
b = (select aa from table1 where quantity > 5) 

我需要:

insert into @temptable from 
select 
a = (select aa from table1 where quantity > 5) 
b = {value from a} 

更新。我写了一个坏榜样,我需要设置BalancePrediction1和BalancePrediction2的值来自余额

INSERT @tmpBalances 
     SELECT PA.ContractId AS 'ContractId', 
      Con.Name AS 'ContractName', 
      Bal.PortfolioAccountId AS 'PortfolioAccountId', 
      PA.Name AS 'PortfolioAccountName', 
      RA.GeneralId AS 'RegisterAccountGeneralId', 
      Bal.BalanceTypeId AS 'BalanceTypeId', 
      Bt.Name AS 'BalanceTypeName', 
      Bt.Type AS 'BalanceTypeType', 
      Bal.BalanceTimeType AS 'BalanceTimeType', 
      Bal.InstrumentId AS 'InstrumentId', 
      Ins.Name AS 'InstrumentName', 
      Ins.GeneralId AS 'InstrumentGeneralId', 
      (Bal.Balance - 
       (  
        SELECT COALESCE(SUM(Mov.Amount), 0) 
         FROM trd.Movements AS Mov 
        WHERE 
         Bal.InstrumentId = Mov.InstrumentId AND 
         Bal.PortfolioAccountId = Mov.PortfolioAccountId AND 
         Bal.BalanceTypeId = Mov.BalanceTypeId AND 
         Bal.BalanceTimeType = Mov.BalanceTimeType AND 
         DateDiff(DAY, @Date, Mov.Date) > 0 AND 
         -- Currency může být null a NULL = NULL nejde 
         COALESCE(Bal.CurrencyId, -1) = COALESCE(Mov.CurrencyId, -1) 
       ) 
      ) as Balance, 
      Balance AS 'BalancePrediction1', 
      Balance AS 'BalancePrediction2', 
      Bal.CurrencyId AS 'CurrencyId', 
      Ccy.Code AS 'CurrencyCode', 
      PA.PositionServiceType 'PositionServiceType', 
      Ccy.Name 'CurrencyName', 
      S.Nominal AS 'Nominal', 
      S.NominalCurrencyId AS 'NominalCurrencyId', 
      trd.GetCurrencyCode(S.NominalCurrencyId) AS 'NominalCurrencyCode' 
      FROM trd.Balances AS Bal 
      JOIN trd.PortfolioAccounts AS PA ON PA.Id = Bal.PortfolioAccountId 
      JOIN trd.Contracts AS Con ON Con.Id = PA.ContractId 
      JOIN trd.RegisterAccounts AS RA ON RA.Id = PA.RegisterAccountId 
      JOIN trd.BalanceTypes AS Bt ON Bt.Id = Bal.BalanceTypeId 
      JOIN trd.Instruments AS Ins ON Ins.Id = Bal.InstrumentId 
      LEFT OUTER JOIN trd.Currencies AS Ccy ON Ccy.Id = Bal.CurrencyId 
      LEFT JOIN trd.SecuritiesView S ON s.Id = Ins.Id AND DateDiff(d, S.ValidFrom, @Date) >= 0 AND (S.ValidTo IS NULL OR DateDiff(d, S.ValidTo, @Date) < 0) 
       AND S.InstrumentInstrumentTypePriceUnit = 1 

回答

3

你可以做一个更新后插入表变量。您可以使用cross apply来计算总和。

INSERT @tmpBalances 
     SELECT PA.ContractId AS 'ContractId', 
      Con.Name AS 'ContractName', 
      Bal.PortfolioAccountId AS 'PortfolioAccountId', 
      PA.Name AS 'PortfolioAccountName', 
      RA.GeneralId AS 'RegisterAccountGeneralId', 
      Bal.BalanceTypeId AS 'BalanceTypeId', 
      Bt.Name AS 'BalanceTypeName', 
      Bt.Type AS 'BalanceTypeType', 
      Bal.BalanceTimeType AS 'BalanceTimeType', 
      Bal.InstrumentId AS 'InstrumentId', 
      Ins.Name AS 'InstrumentName', 
      Ins.GeneralId AS 'InstrumentGeneralId', 
      (Bal.Balance - Mov.SumAmount) AS Balance, 
      (Bal.Balance - Mov.SumAmount) AS 'BalancePrediction1', 
      (Bal.Balance - Mov.SumAmount) AS 'BalancePrediction2', 
      Bal.CurrencyId AS 'CurrencyId', 
      Ccy.Code AS 'CurrencyCode', 
      PA.PositionServiceType 'PositionServiceType', 
      Ccy.Name 'CurrencyName', 
      S.Nominal AS 'Nominal', 
      S.NominalCurrencyId AS 'NominalCurrencyId', 
      trd.GetCurrencyCode(S.NominalCurrencyId) AS 'NominalCurrencyCode' 
      FROM trd.Balances AS Bal 
      JOIN trd.PortfolioAccounts AS PA ON PA.Id = Bal.PortfolioAccountId 
      JOIN trd.Contracts AS Con ON Con.Id = PA.ContractId 
      JOIN trd.RegisterAccounts AS RA ON RA.Id = PA.RegisterAccountId 
      JOIN trd.BalanceTypes AS Bt ON Bt.Id = Bal.BalanceTypeId 
      JOIN trd.Instruments AS Ins ON Ins.Id = Bal.InstrumentId 
      LEFT OUTER JOIN trd.Currencies AS Ccy ON Ccy.Id = Bal.CurrencyId 
      LEFT JOIN trd.SecuritiesView S ON s.Id = Ins.Id AND DateDiff(d, S.ValidFrom, @Date) >= 0 AND (S.ValidTo IS NULL OR DateDiff(d, S.ValidTo, @Date) < 0) 
       AND S.InstrumentInstrumentTypePriceUnit = 1 
      CROSS APPLY (SELECT COALESCE(SUM(Mov.Amount), 0) 
         FROM trd.Movements AS Mov 
         WHERE 
          Bal.InstrumentId = Mov.InstrumentId AND 
          Bal.PortfolioAccountId = Mov.PortfolioAccountId AND 
          Bal.BalanceTypeId = Mov.BalanceTypeId AND 
          Bal.BalanceTimeType = Mov.BalanceTimeType AND 
          DateDiff(DAY, @Date, Mov.Date) > 0 AND 
          -- Currency může být null a NULL = NULL nejde 
          COALESCE(Bal.CurrencyId, -1) = COALESCE(Mov.CurrencyId, -1) 
         ) Mov(SumAmount) 
0

单程;

;with T (value) as (
    select aa from table1 where quantity > 5 
) 
insert into @temptable 
    select value, value from T 
1
SELECT aa AS a, aa AS b 
FROM table1 
WHERE quantity > 5