2009-01-05 9 views
22

Ich habe eine SELECT-Anweisung mit berechneten Spalten und ich möchte den Wert einer berechneten Spalte in einem anderen verwenden. Ist das möglich? Hier ist ein künstliches Beispiel, um zu zeigen, was ich versuche zu tun.SQL Server-Referenz eine berechnete Spalte

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

Ich bin im gleichen Boot .. Hölle SQL Server .. MS Access kann dies tun.Und unsere Geschäftsbenutzer können etwas berechnen, was Sie in der Frage gesagt haben, und sich fragen, warum ich das in SQL nicht tun kann. –

Antwort

20

No.

die alle Ergebnisse aus einer einzigen Reihe von einem Select sind atomar. Das heißt, Sie können sie alle so betrachten, als ob sie parallel auftreten und nicht voneinander abhängen können.

Wenn Sie sich auf berechnete Spalten beziehen, müssen Sie die Eingabe der Formel aktualisieren, damit das Ergebnis während einer Auswahl geändert wird.

Stellen Sie sich berechnete Spalten als Makros oder Mini-Ansichten vor, die bei jedem Aufruf eine kleine Berechnung einleiten.

Zum Beispiel werden diese Spalten identisch sein, immer:

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

Denken Sie auch daran, dass die persisted Option ändert sich nichts davon. Es behält den Wert bei, der für die Indizierung nützlich ist, aber die Atomizität ändert sich nicht.

0

Sie können den Wert einer berechneten Spalte in einer SELECT-Klausel nicht "zurücksetzen", wenn Sie dies versuchen. Der Wert einer berechneten Spalte basiert auf den berechneten Spaltenformeln. Welcher KANN den Wert einer anderen berechneten Spalte enthalten kann .... aber Sie können die Formeln in einer Select-Klausel zurücksetzen ... wenn Sie nur den Wert auf Basis zweier berechneter Spalten ausgeben möchten (wie die Syntax in Ihrer Frage lautet:“Dann wird die ‚[calcval2]‘
in

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

würde nur eine Spalte Alias ​​in der Ausgabe der Select-Klausel.

oder Sie fragt, wie die Formeln für einen definieren berechnete Spalte auf einem anderen basieren?

3

Zwei Möglichkeiten, die ich mir vorstellen kann TU das. Beachten Sie zunächst, dass die Spalte calval1 für SQL Server nicht existiert, bis die Anweisung ausgeführt wurde. Daher kann sie nicht direkt verwendet werden, wie in Ihrem Beispiel gezeigt. Sie können also die Berechnung zweimal eingeben, einmal für calval1 und einmal als Ersatz für calcval1 in der calval2-Berechnung. Der andere Weg ist eine abgeleitete Tabelle mit calval1 darin zu machen und dann calval2 außerhalb der abgeleiteten Tabelle etwas zu berechnen, wie:

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

Sie benötigen sowohl für die Leistung zu testen. anstelle eines subselect

11

Leider nicht wirklich, aber eine Abhilfe, die manchmal ist es wert ist

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

dies funktioniert für mich, obwohl Sie mit ziemlich tiefen Verschachtelung enden können, wenn es viele verschiedene Schritte in Ihren Berechnungen gibt. –

1

Sie sollten eine äußere Anwendung verwenden:

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