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

Sql 可以在视图中使用别名列在其他列中进行计算吗?,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,这里ABC和TotalAmount是别名列,需要在视图中的计算中使用,我无法使用它们。如何实现这一点?我们有没有办法做到这一点或我们不能做到这一点?请帮助。解决问题的简单方法是重复表达式、使用子查询或使用CTE 但是,更智能的方法是为付款计划添加一个参考表。这看起来像: CREATE VIEW dbo.myview1 As SELECT a.Id , a.Name , a.Age , CASE WHEN b.PmtSched ='Monthly' THEN 12 WHEN b

这里ABC和TotalAmount是别名列,需要在视图中的计算中使用,我无法使用它们。如何实现这一点?我们有没有办法做到这一点或我们不能做到这一点?请帮助。

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

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

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
create table PaymentSchedules (
    PaymentScheduleId int identity(1, 1) primary key,
    ScheduleName varchar(255),
    FrequencyPerYear float  -- this could be less often than once per year
);
然后,视图将如下所示:

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
create table PaymentSchedules (
    PaymentScheduleId int identity(1, 1) primary key,
    ScheduleName varchar(255),
    FrequencyPerYear float  -- this could be less often than once per year
);

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

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

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
create table PaymentSchedules (
    PaymentScheduleId int identity(1, 1) primary key,
    ScheduleName varchar(255),
    FrequencyPerYear float  -- this could be less often than once per year
);
然后,视图将如下所示:

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
create table PaymentSchedules (
    PaymentScheduleId int identity(1, 1) primary key,
    ScheduleName varchar(255),
    FrequencyPerYear float  -- this could be less often than once per year
);

是的,您可以使用它,不需要子查询,也不需要CTE。这是一个简单的问题。它非常优雅,并且不影响可读性。如果您需要更多信息,请阅读

请参见此示例:

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;

是的,您可以使用它,不需要子查询,也不需要CTE。这是一个简单的问题。它非常优雅,并且不影响可读性。如果您需要更多信息,请阅读

请参见此示例:

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;
简单回答“否”

这是不可能做到这一点,没有一个

你需要使用

下面的查询将帮助您获得所需的信息

现在可以调用这些别名进行计算

简单回答“否”

这是不可能做到这一点,没有一个

你需要使用

下面的查询将帮助您获得所需的信息

现在可以调用这些别名进行计算


不,不可能。您可以改用子查询或CTE。这适用于所有数据库。不,不可能。您可以改用子查询或CTE。所有数据库都是这样。我想这取决于你的观点。如果不是子查询,您会如何描述
APPLY
后面的括号内容?我想这是一个视角和论点的问题。快速谷歌搜索告诉我,这些子查询可以驻留在WHERE子句、FROM子句或SELECT子句中。我的问题就是基于这个。但这是个好地方。非常感谢。这很有帮助。谢谢@Evaldas Buinauskas,我想这取决于你的观点。如果不是子查询,您会如何描述
APPLY
后面的括号内容?我想这是一个视角和论点的问题。快速谷歌搜索告诉我,这些子查询可以驻留在WHERE子句、FROM子句或SELECT子句中。我的问题就是基于这个。但这是个好地方。非常感谢。这很有帮助。谢谢@Evaldas Buinauskas