【问题标题】:Add a number value to column in SQL query using SELECT method使用 SELECT 方法向 SQL 查询中的列添加数字值
【发布时间】:2021-11-18 14:22:38
【问题描述】:

我正在添加一个计算学费的查询。它应该使用Tuition 表来做到这一点,该表只包括FullTimeCost(学生费用的静态数字)和PerUnitCost(每学分时的成本)。

我正在尝试使用 SELECT 来返回 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 列表中定义的列别名。
  • 要么复制并粘贴上一行的计算,要么使用派生表或 cte。
  • 那么我该如何解决这个问题,它必须使用 Query 来完成,这是一个学校作业,我没有为这个作业创建新表的用户权限。
  • 没问题,阅读下面戈登的回答。
  • 你可能使用的是 MySql 而不是 SQL Server?

标签: sql sql-server select


【解决方案1】:

如 Gordon 的回答所示,使用 apply 是最优雅的解决方案,并且在 cmets 中还指出,这是使用 派生表的另一种方式。

正如您毫无疑问地收集到的那样,问题在于在查询编译期间,优化器不会“看到”计算出的列别名,因为它只能(通常)访问where 子句中的表中可用的列,或者作为由 Gordon 展示,使用 apply()

您还可以使用派生表,首先从表中选择您需要的列,然后添加其他列。

然后您将其包装在括号中 - 它现在是一个派生表,即括号内容的结果本身就是一个可供外部选择使用的表。

然后,您将其用作外部选择的 ,该选择具有您添加的任何其他列的可见性。

您的查询的复杂之处在于您想要添加一个常量值Units 然后引用它,并且 引用第二个使用 Units 的计算列。

我会简单地使用一个派生表来计算 TotalPerUnitCost,您不需要 Units,因为它只使用一次。

select 
    FullTimeCost, PerUnitCost, TotalPerUnitCost,
    FullTimeCost + TotalPerUnitCost as TotalTuition
from (
    select FullTimeCost, PerUnitCost, TotalPerUnitCost, PerUnitCost * 12 as TotalPerUnitCost
    from Tuition
)t

【讨论】:

  • 就像我说的,这是不允许的。它必须是 select 语句的一部分。不过谢谢你,
【解决方案2】:

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

当然,还有其他方法可以做到这一点。不确定您的课程涵盖了哪些内容,但我认为最近的主题应该提供了实现此目的的技巧。

【讨论】:

  • FROM (select *, 12 as Units from dbo.Tuition) t 如果表表达式太高级。
  • 但这也有同样的问题,因为TotalPerUnitCost是派生的。
  • 哎呀 - 错过了第二次计算。当然,OP 在课程材料的帮助下,可以根据需要进行调整。
【解决方案3】:

您不能在select 中重复使用列别名。但是,SQL Server 为您提供了一种在 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);

【讨论】:

  • 我们正在阅读 Murachs SQL Server 2019 的第 3 章。这远远超出了我们迄今为止所学的内容。还有比这更简单的解决方案吗?
猜你喜欢
  • 2016-01-19
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多