可以在视图中使用别名列进行其他列中的计算吗?

suj*_*jai 1 sql sql-server sql-server-2008-r2

CREATE VIEW dbo.myview1 As
SELECT 
a.Id , 
a.Name , 
a.Age , 
CASE 
WHEN b.PmtSched ='Monthly'      THEN 12
WHEN b.PmtSched ='Quarterly'    THEN 4
WHEN b.PmtSched ='Semi-Annual'  THEN 2
WHEN b.PmtSched ='Annually'     THEN 1
ELSE 12
END AS ABC,
SUM(a.Amount) *50 as TotalAmount ,
(a.AmtSpent - TotalAmount) * ABC as TOTALSPENDS 

FROM dbo.User a join dbo.Details b on a.Id = b.Id
Run Code Online (Sandbox Code Playgroud)

这里ABC和TotalAmount是别名列,需要在视图中使用计算,我无法使用它们.如何实现这一点?我们有什么方法可以做到这一点,或者我们不能?请帮助.

Gor*_*off 5

解决问题的简单方法是重复表达式,使用子查询或使用CTE.

但是,更智能的方法是为付款计划添加参考表.这看起来像:

create table PaymentSchedules (
    PaymentScheduleId int identity(1, 1) primary key,
    ScheduleName varchar(255),
    FrequencyPerYear float  -- this could be less often than once per year
);
Run Code Online (Sandbox Code Playgroud)

然后视图看起来像:

CREATE VIEW dbo.myview1 As
    SELECT a.Id, a.Name, a.Age, ps.FrequencyPerYear, 
           SUM(a.Amount) * 50 as TotalAmount,
           (a.AmtSpent - SUM(a.Amount) * 50) * ps.FrequencyPerYear as TOTALSPENDS 
    FROM dbo.User a join
         dbo.Details b
         on a.Id = b.Id join
         dbo.PaymentSchedules ps
         on ps.PaymentScheduleId = a.PamentScheduleId;
Run Code Online (Sandbox Code Playgroud)