Question

J'ai une instruction select avec des colonnes calculées et j'aimerais utiliser la valeur d'une colonne calculée dans une autre. Est-ce possible? Voici un exemple artificiel montrant ce que je suis en train de faire.

SELECT [calcval1] = CASE Statement, [calcval2] = [calcval1] * .25
Était-ce utile?

La solution

Non.

Tous les résultats d'une seule ligne d'une sélection sont atomiques. Autrement dit, vous pouvez tous les voir comme s’ils se déroulaient en parallèle et ne pouvaient pas dépendre les uns des autres.

Si vous vous référez aux colonnes calculées, vous devez mettre à jour l'entrée de la formule pour que le résultat change au cours d'une sélection.

Pensez aux colonnes calculées en tant que macros ou mini-vues qui injectent un petit calcul chaque fois que vous les appelez.

Par exemple, ces colonnes seront identiques, toujours:

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

N'oubliez pas non plus que l'option persistée ne change rien à cela. Il conserve la valeur autour de ce qui est intéressant pour l'indexation, mais l'atomicité ne change pas.

Autres conseils

Malheureusement pas vraiment, mais une solution de contournement qui vaut parfois la peine est

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

Oui c'est possible.

Utilisez la déclaration WITH pour les sélections imbriquées:

Je peux penser à cela de différentes manières. Tout d'abord, comprenez que la colonne calval1 n'existe pas en ce qui concerne SQL Server jusqu'à ce que l'instruction soit exécutée. Par conséquent, elle ne peut pas être utilisée directement pour illustrer votre exemple. Ainsi, vous pouvez mettre le calcul ici deux fois, une fois pour calval1 et une fois en remplacement de calcval1 dans le calcul de calval2. L’autre méthode consiste à créer une table dérivée contenant calval1, puis à calculer calval2 en dehors de la table dérivée, comme suit:

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

Vous devrez tester les performances pour les deux.

Vous devez utiliser une application externe au lieu d'une sous-sélection:

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

Vous ne pouvez pas "réinitialiser". la valeur d'une colonne calculée dans une clause Select, si c'est ce que vous essayez de faire ... La valeur d'une colonne calculée est basée sur les formules de colonne calculées. Quel CAN peut inclure la valeur d’une autre colonne calculée .... mais vous pouvez également réinitialiser les formules dans une clause Select ... si tout ce que vous voulez faire est de "produire" la valeur basée sur deux colonnes calculées (comme le dit la syntaxe de votre question " alors le     "[calcval2]"
dans

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

deviendrait simplement un alias de colonne dans la sortie de la clause de sélection.

ou demandez-vous comment définir les formules pour qu'une colonne calculée soit basée sur une autre?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top