使用 SELECT 方法向 SQL 查询中的列添加数值
Add a number value to column in SQL query using SELECT method
我正在努力添加一个计算学费的查询。它应该通过使用 Tuition
table 来做到这一点,它只包括 FullTimeCost
(学生费用的静态数字)和 PerUnitCost
(每学分的成本) .
我正在尝试使用 SELECT
到 return 3 个以上的列,1 个 12 个调用单位的常量值,以及 2 个基于简单数学计算其余部分的值。
我遇到的问题是我似乎无法使列 Units
具有默认值 12。
这是我的代码,我遇到的问题是当我使用这种方法时,以下公式无法识别在前面几行中创建的列。
我只需要让第 3 行识别单位,以便它可以按预期乘以 12。这也是学校的,所以评论说把它改成12是没有用的。
SELECT
FullTimeCost, PerUnitCost,
12 AS Units,
PerUnitCost * Units AS TotalPerUnitCost,
FullTimeCost + TotalPerUnitCost AS TotalTuition
FROM
Tuition
您不能在 select
中重复使用列别名。但是,SQL 服务器为您提供了一种在 from
子句中定义别名的便捷方式,因此您可以使用它:
SELECT t.FullTimeCost, t.PerUnitCost, v.Units,
v2.TotalPerUnitCost,
(t.FullTimeCost + v2.TotalPerUnitCost AS TotalTuition
FROM Tuition t CROSS APPLY
(VALUES (12)) v(units) CROSS APPLY
(VALUES (t.PerUnitCost * v.Units)) v2(TotalPerUnitCost);
使用 CTE 将您的常量“添加”为列,然后应用计算。没有上下文,变量也同样简单有用。
with cte as (select FullTimeCost, PerUnitCost, 12 as Units
from dbo.Tuition
)
SELECT
FullTimeCost, PerUnitCost,
Units,
PerUnitCost * Units AS TotalPerUnitCost,
FullTimeCost + TotalPerUnitCost AS TotalTuition
FROM cte
order by ...;
当然,还有其他方法可以做到这一点。不确定您的课程涵盖了哪些内容,但我认为最近的主题应该提供了执行此操作的技术。
如 Gordon 的回答所示,使用 apply
是最优雅的解决方案,并且在评论中也指出了另一种使用 derived table 的方法。 =14=]
正如您毫无疑问地收集到的那样,问题是在查询编译期间,优化器不会“看到”计算的列别名,因为它只能(通常)访问 tables 中可用的列where
子句,或者如 Gordon 所示,使用 apply()
.
您还可以使用派生的 table,首先 select 从 table 中获取您需要的列,然后添加其他列。
然后将其括在括号中 - 它现在是一个 派生的 table 即,括号内容的结果本身就是一个 table 可用于外 select.
然后您将其用作外部 select 的 源 ,它具有您添加的任何其他列的可见性。
您的查询的复杂之处在于您想要添加一个常量值 Units 然后引用它,并且 also 引用第二个使用单位的计算列。
我会简单地使用单个派生的 table 来计算 TotalPerUnitCost,您不需要单位,因为它只使用一次。
select
FullTimeCost, PerUnitCost, TotalPerUnitCost,
FullTimeCost + TotalPerUnitCost as TotalTuition
from (
select FullTimeCost, PerUnitCost, TotalPerUnitCost, PerUnitCost * 12 as TotalPerUnitCost
from Tuition
)t
我正在努力添加一个计算学费的查询。它应该通过使用 Tuition
table 来做到这一点,它只包括 FullTimeCost
(学生费用的静态数字)和 PerUnitCost
(每学分的成本) .
我正在尝试使用 SELECT
到 return 3 个以上的列,1 个 12 个调用单位的常量值,以及 2 个基于简单数学计算其余部分的值。
我遇到的问题是我似乎无法使列 Units
具有默认值 12。
这是我的代码,我遇到的问题是当我使用这种方法时,以下公式无法识别在前面几行中创建的列。
我只需要让第 3 行识别单位,以便它可以按预期乘以 12。这也是学校的,所以评论说把它改成12是没有用的。
SELECT
FullTimeCost, PerUnitCost,
12 AS Units,
PerUnitCost * Units AS TotalPerUnitCost,
FullTimeCost + TotalPerUnitCost AS TotalTuition
FROM
Tuition
您不能在 select
中重复使用列别名。但是,SQL 服务器为您提供了一种在 from
子句中定义别名的便捷方式,因此您可以使用它:
SELECT t.FullTimeCost, t.PerUnitCost, v.Units,
v2.TotalPerUnitCost,
(t.FullTimeCost + v2.TotalPerUnitCost AS TotalTuition
FROM Tuition t CROSS APPLY
(VALUES (12)) v(units) CROSS APPLY
(VALUES (t.PerUnitCost * v.Units)) v2(TotalPerUnitCost);
使用 CTE 将您的常量“添加”为列,然后应用计算。没有上下文,变量也同样简单有用。
with cte as (select FullTimeCost, PerUnitCost, 12 as Units
from dbo.Tuition
)
SELECT
FullTimeCost, PerUnitCost,
Units,
PerUnitCost * Units AS TotalPerUnitCost,
FullTimeCost + TotalPerUnitCost AS TotalTuition
FROM cte
order by ...;
当然,还有其他方法可以做到这一点。不确定您的课程涵盖了哪些内容,但我认为最近的主题应该提供了执行此操作的技术。
如 Gordon 的回答所示,使用 apply
是最优雅的解决方案,并且在评论中也指出了另一种使用 derived table 的方法。 =14=]
正如您毫无疑问地收集到的那样,问题是在查询编译期间,优化器不会“看到”计算的列别名,因为它只能(通常)访问 tables 中可用的列where
子句,或者如 Gordon 所示,使用 apply()
.
您还可以使用派生的 table,首先 select 从 table 中获取您需要的列,然后添加其他列。
然后将其括在括号中 - 它现在是一个 派生的 table 即,括号内容的结果本身就是一个 table 可用于外 select.
然后您将其用作外部 select 的 源 ,它具有您添加的任何其他列的可见性。
您的查询的复杂之处在于您想要添加一个常量值 Units 然后引用它,并且 also 引用第二个使用单位的计算列。
我会简单地使用单个派生的 table 来计算 TotalPerUnitCost,您不需要单位,因为它只使用一次。
select
FullTimeCost, PerUnitCost, TotalPerUnitCost,
FullTimeCost + TotalPerUnitCost as TotalTuition
from (
select FullTimeCost, PerUnitCost, TotalPerUnitCost, PerUnitCost * 12 as TotalPerUnitCost
from Tuition
)t