在将来的计算sql中使用计算列

时间:2013-06-19 20:08:20

标签: sql sql-server

我使用以下计算生成了一列:

SELECT b.[CUSIP NUMBER],
       b.[ORIGINAL BALANCE],
       b.[ORIGINAL WA MATURITY],
       b. [PASS THRU RATE],
       b.[ORIGINAL BALANCE] * ( ( b.[PASS THRU RATE] / 12 ) * ( 1 + power (( b.[PASS THRU RATE] / 12),  b.[ORIGINAL WA MATURITY] ) ) / ( 1 + (power (( b.[PASS THRU RATE] / 12 ), b.[ORIGINAL WA MATURITY] )))) Monthlypayment
FROM   DBO.mbs012013 a,
       dbo.mbs022013 b
WHERE  a.[CUSIP NUMBER] = b.[CUSIP NUMBER] 

我想在新计算中使用计算列“MonthlyPayment”。如何在新计算中引用它?当我写Select [MonthlyPayment]时,程序不理解参考。是否可以在将来的计算中使用这些计算列?

2 个答案:

答案 0 :(得分:4)

不允许直接这样做。您可以在另一个级别定义别名。我倾向于在cases where it is permitted中使用CROSS APPLY(如此处所示)。如果在表达式中使用窗口函数,则APPLY方法不起作用。

SELECT b.[CUSIP NUMBER],
       b.[ORIGINAL BALANCE],
       b.[ORIGINAL WA MATURITY],
       b. [PASS THRU RATE],
       Monthlypayment,
       Monthlypayment2
FROM   DBO.mbs012013 a
       JOIN dbo.mbs022013 b
         ON a.[CUSIP NUMBER] = b.[CUSIP NUMBER]
       CROSS APPLY (SELECT b.[ORIGINAL BALANCE] * ( ( b.[PASS THRU RATE] / 12 ) * ( 1 + power (( b.[PASS THRU RATE] / 12 ), b.[ORIGINAL WA MATURITY]) ) / ( 1 + ( power (( b.[PASS THRU RATE] / 12 ), b.[ORIGINAL WA MATURITY]) ) ) )) CA(Monthlypayment)
       CROSS APPLY(SELECT 1 + Monthlypayment) CA2(Monthlypayment2) 

答案 1 :(得分:1)

我认为你的意思是在同一个查询中。答案是肯定的。您需要使用CTE(with语句)或子查询:

select *
from (SELECT b.[CUSIP NUMBER],
             b.[ORIGINAL BALANCE],
             b.[ORIGINAL WA MATURITY],
             b. [PASS THRU RATE],
             b.[ORIGINAL BALANCE] * ( ( b.[PASS THRU RATE] / 12 ) * ( 1 + power (( b.[PASS THRU RATE] / 12),  b.[ORIGINAL WA MATURITY] ) ) / ( 1 + (power (( b.[PASS THRU RATE] / 12 ), b.[ORIGINAL WA MATURITY] )))) Monthlypayment
      FROM   DBO.mbs012013 a join
             dbo.mbs022013 b
             on a.[CUSIP NUMBER] = b.[CUSIP NUMBER]
     ) t

我还修复了你的连接语法,以使用更好的on子句。

如果您希望其他查询可用,请考虑使用此列创建视图。只需将create view <some name> as放在定义之前。