• ベストアンサー

SQL count 別名を条件に使用

いつもお世話になっております。 標題についてご教授頂きたく質問させて頂きました。 [SQL} select A, B, count(*) as cnt from product where A=1 and cnt > 2 group by A order by cnt desc とこのようにSQLを記述して実行したのですが、 cnt>2でエラーが出ます。 order by には count の別名を使用できるのですが、 where句やHAVINGでは使えません。 この場合 cont(*)>2 またはcount(項目名)>2 としなければならないのでしょうか

質問者が選んだベストアンサー

  • ベストアンサー
  • nora1962
  • ベストアンサー率60% (431/717)
回答No.3

SQLのSELECT文の解釈順序が WHERE ↓ GROUP BY ↓ HAVING ↓ SELECT ↓ ORDER BY なのでORDER BYのところだけは指定できます。 集計関数の条件ですからHAVING句で指定してください。 パフォーマンス問題はデータの状況によりますから一概に言えません。 WHERE A=1 の部分で十分に絞り込めるなら問題にはならないでしょう。

prr4e
質問者

補足

回答有難う御座います。 解釈順序でwhereは一番上にあたるから、 count(*) as cnt の別名が使えなかったんですね。 大変参考になりました。 今回は select A, B, count(*) as cnt from product where A=1 group by A having count(*) > 2 order by cnt desc としたいと思います。

すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.2

どうしても使いたいのであれば以下のようにすれば可能です。 select * from (select A,B,count(*) AS CNT from product group by A,B)as T where A=1 and CNT>2 order by CNT desc

prr4e
質問者

補足

回答有難う御座います。 やはり一行では無理なんですね。 最後にHAVING(count(*)>2)を付け加えようと思っています。 パフォーマンス的には問題がありますでしょうか。 以上、宜しくお願い致します。

すると、全ての回答が全文表示されます。
回答No.1

カウントを条件だけで使えばいいのであれば select A, B, count(*) as cnt from product where A=1 and (select count(*) from product where A=1) > 2 group by A, B order by cnt desc こんな感じでいけると思います。 group by 句はselect項目を並べる必要があるのでgroup by A, Bとする必要があります。

prr4e
質問者

補足

回答有難う御座います。 補足が足りず申し訳ありません。 where句に別名としたcntをそのまま使いたかったのですが、 再度count(*)にしなければならないと言う事でしょうか。 お手数ですが宜しくお願い致します。

すると、全ての回答が全文表示されます。

関連するQ&A