Pregunta

Tengo una instrucción select 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.

SELECT [calcval1] = CASE Statement, [calcval2] = [calcval1] * .25
¿Fue útil?

Solución

No.

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

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

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

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

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

También tenga en cuenta que la opción persisted no cambia nada de esto. Mantiene el valor en torno al cual es bueno para la indexación, pero la atomicidad no cambia.

Otros consejos

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

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

Sí, es posible.

Use la WITH Statement para selecciones anidadas:

Hay dos maneras en que puedo pensar en hacer eso. Primero, comprenda que la columna calval1 no existe en lo que respecta a SQL Server hasta que se haya ejecutado la instrucción, por lo tanto, no se puede usar directamente como muestra su ejemplo. Por lo tanto, puede colocar el cálculo allí dos veces, una vez 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 y luego calcular calval2 fuera de la tabla derivada algo así como:

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

Deberá probar el rendimiento de ambos.

Debe usar una aplicación externa en lugar de una subselección:

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

No puede " restablecer " el valor de una columna calculada en una cláusula Select, si eso es lo que está tratando de hacer ... El valor de una columna calculada se basa en las fórmulas de la columna calculada. ¿Qué PUEDE incluir el valor de otra columna calculada? ... pero no puede restablecer las fórmulas en una cláusula Select ... si todo lo que quiere hacer es " salida " el valor basado en dos columnas calculadas (como se lee en la sintaxis de su pregunta " Entonces el     " [calcval2] "
en

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

se convertiría en un alias de columna en la salida de la Cláusula Select.

¿o está preguntando cómo definir las fórmulas para una columna calculada para basarse en otra?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top