2011-12-30 7 views
1

「cnt」でグループ化できず、カウント(*)でグループ化することができないのはなぜですか?これはちょっと冗長なようだし、もっと良い方法があることを願っています。クエリで定義されたエイリアスによるグループ化?

+1

この文は正しくありません: "GROUP BY句のリストでグループに使用された式に集約または副問合せを使用できません。"私はその質問を断言しない。私はそれを投票しない。しかし、説明することはできますか? – danihp

+1

意味をなさない 'count(*)でグループ化することはできません。 –

答えて

3

を必要とするものであるかもしれません。具体的には、GROUP BY句はの前にのSELECT句がクエリの最後に表示されているにもかかわらず評価されます。したがって、SELECTで使用されるエイリアスは、問合せの論理的に先行する部分を評価している間は、必ずしも問合せプロセッサで使用できるわけではありません。

WHERE句でエイリアスを使用できないのと同じ理由があります。その句はSELECTの前に論理的に処理されます。一方、ORDER BYは処理されるクエリの最後の部分です。エイリアス(または序数列の位置も)は、通常はそこでサポートされるです。

いくつかの実装では、このサポートを提供することができます。たとえば、@daghanが投稿したMySQLリンクを参照してください。しかし、それは信頼できません。ご覧のとおり、SQL Serverはサポートしていません。

エイリアスで複雑な式を参照することが必死だったら、おそらくその式をサブクエリに入れてそこから参照することができます。私はほとんどのシンプルなシナリオでは、(あなたの質問のようなもの)しかし、その過剰殺戮と呼ぶだろう。

更新: @MartinSmithは、エイリアシングを除いて、集計式によるグループ化はうまくいかないという質問に対する彼のコメントで良い点を挙げています。実際、集約は非集約列のグループ化によって決定されるため、実際には意味をなさない。あなたは実際にそのようなクエリで何を達成しようとしていますか?多分私たちはさらに助けてくれるかもしれません。

+0

関連する接続項目:[クエリのどこでも列のエイリアスの使用](http://connect.microsoft.com/SQLServer/feedback/details/610120) –

0
SELECT count(*) as cnt 
from table 
group by count(*) 

GROUP BY句でエイリアスを使用することは、多くの順序位置を使用して、同様にANSI規格に拡張することができ、すべてのRDBMSによってサポートされなくてもよいです。上記

1

selectステートメントのorder by句以外の句で列エイリアスを使用する方法はありません。これは、投影リストとそれに続くselectのエイリアシングが、他のすべての節が評価された後、そしてorder byの前にのみ評価されるからです。

関連する問題