2009-01-05 6 views
22

J'ai une instruction select avec des colonnes calculées et je voudrais utiliser la valeur d'une colonne calculée dans une autre. Est-ce possible? Voici un exemple artificiel pour montrer ce que j'essaie de faire.Référence SQL Server une colonne calculée

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

Je suis dans le même bateau .. enfer serveur SQL .. MS Access peut le faire.Et nos utilisateurs professionnels peuvent calculer quelque chose que vous avez dit dans la question et se demande pourquoi je ne peux pas faire en SQL. –

Répondre

20

No.

Tous les résultats d'une seule rangée à partir d'une sélection sont atomique. Autrement dit, vous pouvez les voir tous comme s'ils se produisent en parallèle et ne peuvent pas dépendre l'un de l'autre.

Si vous faites référence à des colonnes calculées, vous devez mettre à jour l'entrée de la formule pour que le résultat change lors d'une sélection. Pensez aux colonnes calculées comme des macros ou mini-vues qui injectent un peu de 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 

Gardez à l'esprit que l'option persisted ne change pas de tout cela. Il garde la valeur autour de laquelle est bon pour l'indexation, mais l'atomicité ne change pas.

0

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. Qui PEUT inclure la valeur d'une autre colonne calculée .... mais vous pouvez 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 la syntaxe dans votre question se lit » Alors le « [calcval2] »
dans

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

serait tout simplement devenir un alias de colonne dans la sortie de la clause SELECT.

ou vous demandent comment définir les formules pour une colonne calculée à être basé sur un autre?

3

Deux façons que je peux penser à fais ça. D'abord comprendre que la colonne calval1 n'existe pas dans la mesure où SQL Server est concerné jusqu'à ce que l'instruction a été exécutée, par conséquent, il ne peut pas être utilisé directement comme le montre votre exemple. Vous pouvez donc y mettre deux fois le calcul, une fois pour calval1 et une fois comme substitution pour calcval1 dans le calcul de calval2. L'autre façon est de faire une table dérivée avec calval1 dans, puis calculer calval2 en dehors de la table dérivée quelque chose comme:

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

Vous aurez besoin de tester à la fois pour la performance.

11

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

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

cela fonctionne pour moi bien que vous puissiez vous retrouver avec une imbrication assez profonde s'il y a beaucoup de différentes étapes dans vos calculs. –

1

Vous devez utiliser une couche extérieure appliquer au lieu d'une sous-sélection:

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