2016-10-01 10 views
-1

を使用されているコンテキストでは有効ではありません。「AMOUNT1は」私はDB2で次のクエリを実行していますそれは

select 
    SUM (orders.totalproduct 
     +orders.TOTALTAX 
     +orders.totalshipping 
     -orders.totaladjustment) as amount1 
from 
    orders 
where 
    amount1>10000 

クエリが実行されていない、私の代わりにこの例外を取得:

"AMOUNT1" は、それが使用されている文脈.. SQLCODE = -206、SQLSTATE = 42703、DRIVERでは有効ではありません= 3.64.96 SQLコード:-206、SQL状態:42703

私は何をしています間違っている?

+0

コードを正しくフォーマットしてください。 –

答えて

0

DB2でamount1を同時に作成して使用することはできません。

これを試してみてください:

select * from (
select SUM (orders.totalproduct+orders.TOTALTAX+orders.totalshipping- orders.totaladjustment) as amount1 from orders 
) tmp where amount1>10000 

またはこれを:

select SUM (orders.totalproduct+orders.TOTALTAX+orders.totalshipping- orders.totaladjustment) as amount1 from orders 
having SUM (orders.totalproduct+orders.TOTALTAX+orders.totalshipping-orders.totaladjustment)>10000 
0

このトピックでは、以来答えた、と私の最初の例が重複している[しかし異なるフォーマット];私が提供するものには価値のあるものがあるかもしれません。

SELECT列リストの式に割り当てられた名前は、同じSELECTクエリの他の句の範囲内の参照には使用できません。例えばそこに割り当てられた名前は、ORDER BY句で参照可能ですが、WHERE句またはHAVING句では参照できません。したがって、表示されるエラーについて説明します。 HAVING句[注目:スカラー副選択のように書き換えられない限り集合体は、WHERE句で許可されていない]中での発現を繰り返す避けるため

派生テーブル内の式の結果に名前を割り当てることを検討式;名前をその派生テーブルのクエリにスコープすることができます。 複製への参照を排除することで、2つのコピーを同一に維持する必要がなくなります。

ここに示すテーブル識別子と修飾列名の使用はどちらもオプションですが、参照された名前がどこにあるのかを明確にするために含まれています。例は、名前付き式を参照するために派生テーブルをコード化する2つの方法を示しています。

select S.AMOUNT1 
from table /* Nested Table Expression (NTE) */ 
    (select 
     SUM (orders.totalproduct 
      + orders.TOTALTAX 
      + orders.totalshipping 
      - orders.totaladjustment 
     ) as amount1 
    from orders 
) as S 
where S.amount1>10000 

with /* Common Table Expression (CTE) */ 
    aggSum (AMOUNT1) as 
    (select 
     SUM (orders.totalproduct 
      + orders.TOTALTAX 
      + orders.totalshipping 
      - orders.totaladjustment 
      ) as amount1 /* named here; or, as shown, named above */ 
     from orders 
    ) 
select C.AMOUNT1 
from aggSum as C /* from the above (CTE) */ 
where C.amount1>10000 

次のオプションは、私が見つける[私は私が今までのコード、理由はないだろう1]が同様にありますが、このはるかに難しいだけでHAVING句で式に重複の参照をしたよりも読み[すなわち、受け入れられた答えの2番目の例に示すように]。

select 
    SUM (orders.totalproduct 
     + orders.TOTALTAX 
     + orders.totalshipping 
     - orders.totaladjustment 
     ) as amount1 
    from orders 
    where (select 
      SUM (orders.totalproduct 
       + orders.TOTALTAX 
       + orders.totalshipping 
       - orders.totaladjustment 
       ) 
      from orders 
     ) > 10000 
0

DB2で、あなたがあなたの列に対して作成したエイリアスを使用することはできません。それは、その後、WHERE句にスカラー副選択として参照されているように、このクエリは、サブクエリで同じ集計クエリをカプセル化しますwhere/havingと同じサブクエリにあります。

でも、MySQL/BigQueryの場合でも、グループ内の任意の別名は、/ order by/having文でのみ参照できます。

サブクエリを使用してフィルタを適用するか、列のコードをコピーして(別名なし)、場所に貼り付けます。しかし、サブクエリオプションをお勧めします。

関連する問題