2009-01-05 245 views
22

我有一个计算列的select语句,我想在另一个计算列中使用一个值。这可能吗?这是一个人为的例子,以显示我正在尝试做什么。SQL Server参考计算列

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

我在同一条船上..地狱SQL服务器。MS Access可以做到这一点。我们的业务用户可以计算出您在问题中所说的内容,并想知道为什么我无法使用SQL。 – 2010-02-23 18:25:50

回答

20

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

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

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

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

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

还要记住的是,persisted选项不改变任何这一点。它保持了对索引很好的值,但原子性不会改变。

0

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

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

只想成为一个列别名在SELECT子句的输出。

还是想提出如何定义公式一计算栏要根据另一个?

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 

你需要来测试性能。

11

不幸的是不是真的,但一个变通方法,有时是值得的,是

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

这适用于我,尽管如果计算中有很多不同的步骤,最终可能会产生很深的嵌套。 – 2015-11-12 23:19:01

1

您应该使用外部应用,而不是一个子查询:

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