sql-server - especificacion - sql server columna calculada condicional
Referencia de SQL Server una columna calculada (6)
Tengo una instrucción seleccionada 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
Dos maneras en que puedo pensar para hacer 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 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 ambos para el rendimiento.
Lamentablemente, no en realidad, 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)
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 la pregunta dice "Entonces el" [calcval2] "
en
SELECT [calcval1] = CASE Statement, [calcval2] = [calcval1] * .25
simplemente se convertiría en un alias de columna en el resultado de la Cláusula Select.
o ¿está preguntando cómo definir las fórmulas para que una columna calculada se base en otra?
No.
Todos los resultados de una sola fila de un selecto son atómicos. 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 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 alrededor del cual es bueno para la indexación, pero la atomicidad no cambia.
Debería 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
Si es posible.
Use la declaración WITH para selecciones anidadas: