2009-01-05 26 views
22

Tengo una instrucción de selección con columnas calculadas y me gustaría usar el valor de una columna calculada en otra. es posible? Aquí hay un ejemplo artificial para mostrar lo que estoy tratando de hacer.SQL Server Referencia a Columna calculada

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

estoy en el mismo barco .. Infierno servidor SQL .. MS Access puede hacer esto.Y nuestros usuarios comerciales pueden calcular algo que usted dijo en la pregunta y se pregunta por qué no puedo hacerlo en SQL. –

Respuesta

20

Todos los resultados de una sola fila de un selecto son atómica. Es decir, puede verlos todos como si ocurrieran en paralelo y no pueden depender el uno del otro.

Si se refiere a columnas calculadas, entonces necesita actualizar la entrada de la fórmula para que el resultado cambie durante una selección.

Piense en columnas calculadas como macros o mini-vistas que inyectan un pequeño cálculo cada vez que los llama.

Por ejemplo, estas columnas serán idénticos, siempre:

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

También hay que tener en cuenta que la opción persisted no cambia nada de esto. Mantiene el valor alrededor del cual es bueno para la indexación, pero la atomicidad no cambia.

0

No puede "restablecer" el valor de una columna calculada en una cláusula Select, si eso es lo que intenta hacer ... El valor de una columna calculada se basa en las fórmulas de columnas calculadas. Que PUEDE incluir el valor de otra columna calculada ... pero puede restablecer las fórmulas en una cláusula Seleccionar ... si todo lo que quiere hacer es "generar" el valor basado en dos columnas calculadas, (como la sintaxis en su cuestión dice" Entonces el '[calcval2]'
en

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

que acaba de convertirse en un alias de columna en la salida de la cláusula select.

o estás preguntando cómo definir las fórmulas para una columna calculada que se basará en otra?

3

Dos maneras en que se me ocurre Haz eso. Primero, comprenda que la columna calval1 no existe en lo que concierne a SQL Server hasta que se haya ejecutado la instrucción, por lo tanto, no se puede usar directamente como muestra su ejemplo. Entonces puede poner el cálculo allí dos veces, una para calval1 y otra como sustitución de calcval1 en el cálculo de calval2. La otra forma es hacer una tabla derivada con calval1 en ella y luego calcular calval2 fuera de la mesa algo derivado como:

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

Tendrá que poner a prueba tanto para el rendimiento.

11

Desafortunadamente no realmente, pero una solución que es a veces vale la pena es

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

esto funciona para mí aunque puede terminar anidando bastante si hay muchos pasos diferentes en sus cálculos. –

1

Se debe utilizar una combinación externa en lugar de aplicar una subselección:

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