2016-08-03 16 views
0

SQLの計算フィールドでorder byを使用するにはどうすればよいですか?order byをSQLの計算フィールドで使用するには?

select a.Customer 
    ,a.PlanTo 
    ,a.Dollar01 
    ,a.Dollar02 
    ,a.Dollar03 
    ,a.Dollar04 
    ,a.Dollar05 
    ,a.Dollar06 
    ,a.Dollar07 
    ,a.Dollar08 
    ,a.Dollar09 
    ,a.Dollar10 
    ,a.Dollar11 
    ,a.Dollar12 
    ,(CAST(a.Dollar01 as decimal) + CAST(a.Dollar02 as decimal) 
    + CAST(a.Dollar03 as decimal) + CAST(a.Dollar04 as decimal) 
    + CAST(a.Dollar05 as decimal) + CAST(a.Dollar06 as decimal) 
    + CAST(a.Dollar07 as decimal) + CAST(a.Dollar08 as decimal) 
    + CAST(a.Dollar09 as decimal) + CAST(a.Dollar10 as decimal) 
    + CAST(a.Dollar11 as decimal) + CAST(a.Dollar12 as decimal)) as TOTAL1 
from MDM_STAT.sds.SMarginText a 
where a.salesyear = '2016' 
order by a.total1 

これは「TOTAL1」列が存在しない私を与えていますが、私はそれを作成していると私はorder by句を使用していない場合は働いている見るように。

+1

エイリアス 'a.'を削除してください - 'order by total1' ... – sgeddes

+1

' a.total1'は存在しません.SQL Serverは 'SMarginText'ではその列を探しますが、 'ORDER BY TOTAL1 ; 'うまくいく。 –

+0

(1)あなたのコードをフォーマットし、(2)実際に使用しているDBMSをClarify(タグ)しますか?PostgreSQLかSQL Serverですか? – Nicarus

答えて

3

Mureinikが提案するものを実行して、ORDER BY 13の序数表記を使用することができます。これは、「13番目の列による注文」を意味します。しかし、私はそれを避ける傾向があります。なぜなら、あなたが後で戻った場合には、を予定していることを伝えるのが難しいからです。また、列の追加や順序の変更が必要な場合は、ORDER BY句の更新を忘れないでください。それを見逃すのは簡単です。

他にもコメントに記載されているように、ORDER BYで指定したエイリアスを使用することができます。ただし、列のエイリアスなので、完全修飾はありません。 a.TOTAL1は何も意味しません。あなたはORDER BY TOTAL1

select a.Customer 
    ,a.PlanTo 
    ,a.Dollar01 
    ,a.Dollar02 
    ,a.Dollar03 
    ,a.Dollar04 
    ,a.Dollar05 
    ,a.Dollar06 
    ,a.Dollar07 
    ,a.Dollar08 
    ,a.Dollar09 
    ,a.Dollar10 
    ,a.Dollar11 
    ,a.Dollar12 
    ,(CAST(a.Dollar01 as decimal) + CAST(a.Dollar02 as decimal) 
    + CAST(a.Dollar03 as decimal) + CAST(a.Dollar04 as decimal) 
    + CAST(a.Dollar05 as decimal) + CAST(a.Dollar06 as decimal) 
    + CAST(a.Dollar07 as decimal) + CAST(a.Dollar08 as decimal) 
    + CAST(a.Dollar09 as decimal) + CAST(a.Dollar10 as decimal) 
    + CAST(a.Dollar11 as decimal) + CAST(a.Dollar12 as decimal)) as TOTAL1 
from MDM_STAT.sds.SMarginText a 
where a.salesyear = '2016' 
order by total1 

でなければなりません。これは、クエリ解決のために機能します。 ORDER BYは、SELECTの前に解決されるWHEREまたはFROMとは異なり、SELECTの後に解決されるため、SQL Serverの列の別名は参照できません。

これは、テーブルの列と同じ名前の列エイリアスがある場合、混乱したり曖昧になる可能性があるため、注意する必要があります。

+0

ありがとうございます。これは、節がどのように機能するかを理解する上で非常に役立ちました。感謝します。 –

+0

@RahulBanerjee注文クエリが実行されたことを知ることは役に立ちます。興味のある方は、[Here](http://stackoverflow.com/a/17403990/696808)をご覧ください。 –

1

最も簡単な方法は、名前の代わりに選択リストで列の番号を使用することです:ORDER BY 13。私はそれが最も単純な答えだと思うとコミュニティのwikiとしてアーロン・ベルトランさんのコメントを投稿

+2

を削除しました。(特に生産コードの場合は、序文が非常に脆いので、このような恐ろしいアイデアは避けてください)(http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/06/bad-habits- to-kick-order-by-ordinal.aspx)を実行します。他のニュースでは、あなたの料理を洗う最も簡単な方法は、それらを捨てて新しいものを買うことです。 (「最も簡単」と「最高」はほとんど同じです) –

2

、:

a.total1 SQL ServerがSMarginTextにその列を探しますが、ORDER BY TOTAL1;がうまく動作するから、存在しません。 。

関連する問題