【问题标题】:SQL Server Reference a Calculated ColumnSQL Server 引用计算列
【发布时间】:2010-09-29 15:36:44
【问题描述】:

我有一个包含计算列的 select 语句,我想在另一个计算列中使用一个计算列的值。这可能吗?这是一个人为的例子来展示我想要做什么。

SELECT [calcval1] = CASE Statement, [calcval2] = [calcval1] * .25

【问题讨论】:

  • 我在同一条船上.. 地狱 SQL 服务器.. MS Access 可以做到这一点。我们的业务用户可以计算出您在问题中所说的内容,并想知道为什么我不能用 SQL 做。

标签: sql-server tsql calculated-columns


【解决方案1】:

没有。

选择中单行的所有结果都是原子的。也就是说,您可以将它们全部视为并行发生并且不能相互依赖。

如果您指的是计算列,那么您需要更新公式的输入,以便在选择期间更改结果。

将计算列视为宏或迷你视图,在您调用它们时会注入一些计算。

例如,这些列总是相同的:

-- assume that 'Calc' is a computed column equal to Salaray*.25
SELECT Calc, Salary*.25 Calc2 FROM YourTable

还请记住,persisted 选项不会改变任何这些。它保留了适合索引的值,但原子性不会改变。

【讨论】:

    【解决方案2】:

    如果您正在尝试执行此操作,则无法在 Select 子句中“重置”计算列的值...计算列的值基于计算列公式。哪个可以包含另一个计算列的值....但是您不能重置 Select 子句中的公式...如果您要做的只是“输出”基于两个计算列的值,(如您的语法中的问题读取“然后 “[calcval2]”

    SELECT [calcval1] = CASE Statement, [calcval2] = [calcval1] * .25 
    

    只会成为 Select Clause 输出中的列别名。

    或者您是在问如何定义一个计算列的公式以基于另一个计算列?

    【讨论】:

      【解决方案3】:

      我能想到两种方法来做到这一点。首先要了解,就 SQL Server 而言,在语句运行之前,calval1 列不存在,因此不能直接使用它,如您的示例所示。因此,您可以将计算放在那里两次,一次用于 calval1,一次用于替换 calval2 计算中的 calcval1。 另一种方法是创建一个包含 calval1 的派生表,然后在派生表之外计算 calval2,如下所示:

      select calcval1*.25 as calval2, calval1, field1, field2
      from (select casestament as cavlval1, field1, field2 from my table) a
      

      您需要测试两者的性能。

      【讨论】:

        【解决方案4】:

        不幸的是,并非如此,但有时值得的解决方法

        SELECT [calcval1], [calcval1] * .25 AS [calcval2]
        FROM (SELECT [calcval1] = CASE Statement FROM whatever WHERE whatever)
        

        【讨论】:

        • 这对我有用,但如果您的计算中有许多不同的步骤,您最终可能会得到非常深的嵌套。
        【解决方案5】:

        您应该使用外部应用而不是子选择:

        select V.calc,V.calc*0.25 from FOO outer apply (select case Statement as calc) V
        

        【讨论】:

          【解决方案6】:

          是的,这是可能的。

          使用WITH Statement 进行嵌套选择:

          【讨论】:

            猜你喜欢
            • 2010-11-22
            • 2011-05-04
            • 1970-01-01
            • 1970-01-01
            • 2016-08-09
            • 2011-04-11
            • 2010-09-07
            • 1970-01-01
            相关资源
            最近更新 更多