使用 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