1

質問の言い方がよくわからなかったし、言葉遣いが悪いことはわかっていましたが、質問自体は非常に簡単です。

これが私がやろうとしていることです。

 SELECT /*stuff*/
      , ISNULL (a.z, a.y) AS "c1"
      , SUM(a.x - c1) AS "c2"
 /* more stuff */

これが起こることです。

列名 'c1' が無効です。

私がやろうとしていることが可能かどうかさえわかりません。コードの他の場所でいつでも実行できますが、ほとんどの作業は SQL に任せるようにしています。

SQL Server 2008 R2 を使用しています。

4

4 に答える 4

5

クエリを別のクエリ内に配置して、エイリアスを使用できます

SELECT Sum(a.x - c1) as c2
FROM
(
    SELECT /*stuff*/
      , ISNULL (a.z, a.y) AS "c1"
     /* more stuff */
) a

または

SELECT /*stuff*/
      , ISNULL (a.z, a.y) AS "c1"
      , SUM(a.x - ISNULL (a.z, a.y)) AS "c2"
 /* more stuff */
于 2012-05-29T14:23:30.697 に答える
3

の同じレベルで別の列のエイリアスを使用することはできませんSELECT

あなたはこれをしなければならないでしょう -

SELECT /*stuff*/
  , ISNULL (a.z, a.y) AS "c1"
  , SUM(a.x - ISNULL (a.z, a.y)) AS "c2"
/* more stuff */

また、が の場合、列に値a.zのみが含まれているかNULL、列a.yに値a.zが含まれていることを確認してNULLください。価値観とはNumbers

于 2012-05-29T14:23:15.047 に答える
1

「繰り返さないでください」を守るために、一般的なテーブル式を提案します。

with cte as (
   select ISNULL (a.z, a.y) AS [c1]
   from yourTable
)
select sum([c1])
from cte

ISNULL (a.z, a.y)そうすれば、クエリのビットを繰り返す必要はありません。

于 2012-05-29T19:27:37.167 に答える
0

関数を 1 行にまとめた方が簡単です。C1 が必要ない場合は、出力として削除してください。

SELECT /*stuff*/
      , ISNULL (a.z, a.y) AS "c1"
      , SUM(a.x - ISNULL(a.z, a.y)) AS "c2"
于 2012-05-29T14:25:51.040 に答える