27

計算列を含む select ステートメントがあり、ある計算列の値を別の計算列で使用したいと考えています。これは可能ですか?これは、私がやろうとしていることを示すための不自然な例です。

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

6 に答える 6

21

いいえ。

選択からの単一行の結果はすべてアトミックです。つまり、すべてが並行して発生し、相互に依存できないかのように表示できます。

計算列を参照している場合は、選択中に結果が変化するように数式の入力を更新する必要があります。

計算列は、呼び出すたびに小さな計算を挿入するマクロまたはミニビューと考えてください。

たとえば、これらの列は常に同一です。

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

また、persistedオプションはこれを変更しないことに注意してください。インデックス作成に適した値を保持しますが、原子性は変わりません。

于 2009-01-05T17:01:58.863 に答える
11

残念ながら実際にはそうではありませんが、時には価値のある回避策があります

SELECT [calcval1], [calcval1] * .25 AS [calcval2]
FROM (SELECT [calcval1] = CASE Statement FROM whatever WHERE whatever)
于 2009-01-05T17:54:34.703 に答える
3

それを行うために私が考えることができる2つの方法。最初に、SQL Serverに関する限り、ステートメントが実行されるまで calval1 列が存在しないことを理解してください。したがって、例を示すように直接使用することはできません。つまり、calval1 に対して 1 回、calval2 計算で calcval1 の代用として 1 回、計 2 回そこに計算を入れることができます。もう 1 つの方法は、calval1 を含む派生テーブルを作成し、派生テーブルの外部で calval2 を次のように計算することです。

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

両方のパフォーマンスをテストする必要があります。

于 2009-01-05T17:05:37.157 に答える
2

サブセレクトの代わりに外部適用を使用する必要があります。

select V.calc,V.calc*0.25 from FOO outer apply (select case Statement as calc) V
于 2012-11-20T15:39:37.977 に答える
0

Select句で計算列の値を「リセット」することはできません.それがあなたがやろうとしていることです.計算列の値は、計算列の式に基づいています。別の計算列の値を含めることができます....しかし、Select句で式をリセットすることはできません... 2つの計算列に基づいて値を「出力」することだけが必要な場合(質問の読み取り」次に
、「[calcval2]」

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

Select句の出力で列の別名になるだけです。

または、ある計算列の数式を別の計算列に基づいて定義する方法を尋ねていますか?

于 2009-01-05T17:02:29.317 に答える