Pergunta

Eu tenho uma instrução SELECT com colunas calculadas e eu gostaria de usar o valor de uma coluna calculada em outro. Isso é possível? Aqui é um exemplo inventado para mostrar o que estou tentando fazer.

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

Solução

Não.

Todos os resultados de uma única linha de um seleto são atômicas. Ou seja, você pode vê-los todos como se eles ocorrem em paralelo e não pode depender um do outro.

Se você está se referindo colunas computadas, então você precisa atualizar a entrada da fórmula para o resultado a mudança durante um seleto.

Pense em colunas computadas como macros ou mini-vista que injetar um pouco de cálculo sempre que você chamá-los.

Por exemplo, estas colunas serão idênticos, sempre:

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

Também tenha em mente que a opção persisted não muda nada disso. Ele mantém o valor em torno do que é bom para a indexação, mas o atomicity não muda.

Outras dicas

Infelizmente não realmente, mas uma solução que é, por vezes, vale a pena é

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

Sim, é possível.

Use a com a declaração para seleciona aninhados:

Duas maneiras que eu posso pensar de fazer isso. Primeiro entender que a coluna calval1 não existe na medida em que o SQL Server está em causa até que a instrução foi executado, portanto, não pode ser usado diretamente como showning seu exemplo. Então você pode colocar o cálculo lá duas vezes, uma para calval1 e uma vez como substituição para calcval1 no cálculo calval2. A outra maneira é fazer uma tabela derivada com calval1 nele e calval2 então calcular fora da tabela algo derivado como:

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

Você vai precisar para testar tanto para o desempenho.

Você deve usar aplicar um exterior em vez de um subselect:

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

Você não pode "redefinir" o valor de uma coluna calculada em uma cláusula Select, se é isso que você está tentando fazer ... O valor de uma coluna calculada é baseada em fórmulas coluna calculada. Que pode incluir o valor de outra coluna calculada .... mas você canlt repor as fórmulas em uma cláusula SELECT ... se tudo que você quer fazer é "output" o valor com base em duas colunas calculadas, (como a sintaxe em sua pergunta lê" Então o "[Calcval2]"
em

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

que acaba de se tornar um alias de coluna na saída do Select cláusula.

ou você está perguntando como para definir as fórmulas para uma coluna calculada para ser baseado em outro?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top