SQL Server引用计算列

时间:2009-01-05 16:57:21

标签: sql-server tsql calculated-columns

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

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

6 个答案:

答案 0 :(得分:21)

没有

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

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

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

例如,这些列将始终相同:

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

另请注意,persisted选项不会更改任何此选项。它保持了值很好的索引值,但原子性不会改变。

答案 1 :(得分:11)

不幸的是不是真的,但有时值得的解决方法是

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

答案 2 :(得分: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

你需要测试两者的性能。

答案 3 :(得分:3)

是的,这是可能的。

使用WITH Statement嵌套选择:

答案 4 :(得分:2)

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

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

答案 5 :(得分:0)

如果您正在尝试执行此操作,则无法“重置”Select子句中计算列的值...计算列的值基于计算的列公式。哪个CAN包含另一个计算列的值....但是你不能重置Select子句中的公式...如果你想要做的就是根据两个计算列“输出”该值,(作为你的语法)问题写着“那么     “[calcval2]”

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

将成为Select子句输出中的列别名。

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