我有一个带有计算列的select语句,我想在另一个中使用一个计算列的值。这可能吗?这是一个人为的例子来展示我想要做的事情。
SELECT [calcval1] = CASE Statement, [calcval2] = [calcval1] * .25
答案 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子句输出中的列别名。
或者您是否在询问如何为一个计算列定义基于另一个的公式?