• ベストアンサー

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

  • SQLでのCOUNT関数の使い方

    表A           表B 商品ID 数量 価格    商品ID 商品名  ------ ---- ----    ------ ------ 0001   10 1000    0001  万年筆 0002   50 200     0002  ボールペン 0003   25 600     0003  シャーペン 0004   150 2000    0004  文房具セット 0005   20 420     0005  ノート SELECT 数量,価格,商品名,商品ID FROM 表A,表B WHERE 表A.商品ID = 表B.商品ID とやると恐らくこんなような表ができると思います。 商品ID 数量 価格 商品名  ------ ---- ---- ------ 0001  10   1000 万年筆 0002  50   200 ボールペン 0003  25   600 シャーペン 0004  150  2000 文房具セット 0005  20   420 ノート ここで、表の行数を6で割ったときの余りの数を表に追加して全体の行数を6の倍数にしたいと思っています。 (ID 0006として空行を追加) しかし、この表の行数を取得するためにCOUNT関数を使うと思うのですが、使い方が分かりません。 COUNT関数を使うにはGROUP BY句とHAVING句を扱うらしいのですがSELECT句にある列名全部をGROUP BY句に入れないといけないらしく思ったとおりのことが出来ません。 上記のSQLとCOUNT関数を1つのSQLで表の作成と行の行数を得たいと思っています。(ここでは、5行なので5という値を取得したい。) また、最後にどうやって空行を追加すれば良いかも分かりません。 具体的なSQLのソースなど、どなたか分かりましたら、教えてください。

  • SQL 句の評価順

    SQL句の評価順について皆さんの意見をいただけないでしょうか? <ケース1:SELECTが最後> ・FROM ・WHERE ・GROUP ・HAVING ・ORDER ・SELECT <ケース2:SELECTがトップ> ・SELECT ・FROM ・WHERE ・GROUP ・HAVING ・ORDER <ケース3:ORDERの前にSELECT> ・FROM ・WHERE ・GROUP ・HAVING ・SELECT ・ORDER どのケースで評価されますでしょうか? ご教授お願いします。

  • 秀丸でSQLを書く際に SQLの予約語だけ大文字

    秀丸でSQLを書く際に SQLの予約語だけを、大文字に変換するよい方法は? たとえば select * from table_1 where id=1 order by id desc; と書いて、マクロを起動すると SELECT * FROM talbe_1 WHERE id=1 ORDER BY id DESC; となるようにするよい方法はありませんか? また、予約語が「強調」されると尚良いです。

  • PostgresのSQL文

    誕生日を取得するSQLとして以下の文を発行し、 -- 誕生日の並び替え(多い順) select trunc((current_date - to_date(birth,'YYYY/MM/DD'))/365) as age, count(*) as cnt from tb_custom_user where birth is not null group by age order by cnt desc; 次の結果を得ました。 age | cnt -----+----- 25 | 2 26 | 1 28 | 1 (3 rows) cntが最大数のときのageだけを取得したい場合、 上記のSQLをどう変更すればいいのでしょうか?

  • 動的SQLのCOUNTのとり方

    動的SQLで、DBの件数を取得したいのですが、 うまく取得できず困っています。 教えてください! 以下の様に、記述しているのですが取り方間違っていますか? EXEC SQL EXECUTE statment INTO :CNTNUM; PREPEAした、statmentには SELECT COUNT(*) FROM テーブル名 where kbn = 3; と、ごくごく普通のSELECT COUNT文です。 cnt_numは、int型のホスト変数で宣言しています。 デバックしながら実行すると、cnt_numの値は初期化した時の 0のままです。実際取得した件数が0件なのかもと思い 初期化時に3を代入して実行したら、やはり値は3でした。 なので、件数が取得出来ていないようです。 オラクルエラーにもならず、次の処理へ流れていってしまいます。 知っている方、教えてください。

  • SQLエラー

    検索システムの検索結果の分割をしようとしています。 しかしどうしてもSQL文にエラーがでてしまいます。 SELECT * FROM shops where (area='◯◯◯') ORDER BY id DESC limit0, 10 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'limit0, 10' at line 1 該当するSQL文は以下になります。 $query = "SELECT * FROM shops"; $where = array(); if (isset($_GET['area'])and($_GET['area'] !== '')) { $where[] = sprintf("(area='%s')", mysql_real_escape_string($_GET['area'])); } if (count($where) <> 0) { $query .= ' where ' . implode(' and ', $where) . ' ORDER BY id DESC '; }   $query .= "limit" . $page_num*10 . ", 10" ; limit句の使い方等間違いはないのかなと思うのですが、いかがでしょうか? アドバイスご教示いただけないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • WITH句を使用したSQLの結果

    WITH句を使用して総件数と1~20件までのデータを同時に取得するSQLを組んでみたところ、 WITH TMP AS (SELECT ROW_NUMBER() OVER (ORDER BY NO) AS CHECKROWNUM,NAME FROM TEST_TBL ORDER BY NO) SELECT T1.ALLCNT, T2.* FROM (SELECT COUNT(*) ALLCNT FROM TMP) T1, TMP T2 WHERE T2.CHECKROWNUM BETWEEN 1 AND 20; Oracle10.2.0.3.0のバージョンで ALLCNTが21になってしまう現象が発生してしまいました。 Oracle10.2.0.4.0や9iでは発生せず正しい総件数が取得できるのですが、 バージョンによる不具合は考えられますでしょうか。 それともSQL自体なにか悪い部分があるのでしょうか。 ちなみに T2.CHECKROWNUM BETWEEN 1 AND 100; と帰るとALLCNTが101と帰ってきます。 また、WITH句を使わず下記のようにTMPの部分をWITH句で使用したSQLに 置き換えると正しくALLCNTが取れます。 SELECT T1.ALLCNT, T2.* FROM (SELECT COUNT(*) ALLCNT FROM (SELECT ROW_NUMBER() OVER (ORDER BY NO) AS CHECKROWNUM,NAME FROM TEST_TBL ORDER BY NO)) T1, (SELECT ROW_NUMBER() OVER (ORDER BY NO) AS CHECKROWNUM,NAME FROM TEST_TBL ORDER BY NO) T2 WHERE T2.CHECKROWNUM BETWEEN 1 AND 20;

  • ORDER BY句を使用しているSQL文に関して質問です。

    ORDER BY句を使用しているSQL文に関して質問です。 SELECT文にてORDER BY句を使用した場合、SELECT結果の件数によってソート順が変わるような事はあるのでしょうか? 事象としては以下の通りです。 以下のCUSTOMERテーブルがあるとします。 |店番|顧客番号|一連番号|一連番号枝番| |MISE|KOKYAKU |ITIREN |IEIRENEDANO | |0001|11111111|00000001|000000000000| |0001|11111111|00000002|000000000000| |0001|11111111|00000003|000000000000| |0001|11111111|00000004|000000000000| |0001|11111111|00000005|000000000000| |0001|11111111|00000005|000000000001| |0001|22222222|00000001|000000000000| |0001|22222222|00000002|000000000000| |0001|22222222|00000003|000000000000| |0001|22222222|00000004|000000000000| |0001|22222222|00000005|000000000000| |0001|22222222|00000006|000000000000| |0001|22222222|00000007|000000000000| |0001|22222222|00000008|000000000000| |0001|22222222|00000009|000000000000| |0001|22222222|00000010|000000000000| |0001|22222222|00000011|000000000000| |0001|22222222|00000012|000000000000| |0001|22222222|00000013|000000000000| |0001|22222222|00000014|000000000000| |0001|22222222|00000014|000000000001| 埋め込みSQLを実行し、上記のテーブルに対し以下の条件でカーソルをオープンしました。 (1)SELECT ITIREN FROM CUSTOMER WHERE MISE = 0001 AND KOKYAKU = 11111111 ORDER BY ITIREN DESC (2)SELECT ITIREN FROM CUSTOMER WHERE MISE = 0001 AND KOKYAKU = 22222222 ORDER BY ITIREN DESC カーソルの1件目をFETCHしたところ、以下のような結果となりました。 (1) |店番|顧客番号|一連番号|一連番号枝番| |MISE|KOKYAKU |ITIREN |IEIRENEDANO | |0001|11111111|00000005|000000000001| (2) |店番|顧客番号|一連番号|一連番号枝番| |MISE|KOKYAKU |ITIREN |IEIRENEDANO | |0001|22222222|00000014|000000000000| 一連番号枝番をORDER BY句のソート条件に追加するか、WHERE句の条件についかすれば事象は解決するのですが、同様のSQLを実行しているのに結果が変わってしまうのがどうしても解せません。 もしご存知の方がいらっしゃいましたら、ご教授頂けると助かります。 テーブルの内容をごちゃごちゃと書いてしまったので、見づらくてすみません。。。 レイアウトがずれてたら更にすみませんm(_ _)m HTMLのタグって使えるんでしょうかね?

  • countで0を返せますか?

    PHP,Mysql5です。 IFNULL関数で実現できそうなことがわかり以下のようなソースで 試してみたのですが0ではなくnullが返ってきてしまいます・・・ $where_sql = join(' || ' , $where); //$where_sqlの中身 DATE_FORMAT(create_date, '%Y-%m-%d') = '2009-03-01' || DATE_FORMAT(create_date, '%Y-%m-%d') = '2009-03-02' || 中略・・・ DATE_FORMAT(create_date, '%Y-%m-%d') = '2009-03-30' || DATE_FORMAT(create_date, '%Y-%m-%d') = '2009-03-31' $sql = "SELECT create_date, IFNULL(Count(order_id), 0) as cnt FROM products_order_detail WHERE {$where_sql} GROUP BY order_id"; 例えば以下のような構成だとします。 2009-03-05のデータが1件存在 2009-03-12のデータが2件存在 2009-03-24のデータが1件存在 現状の結果は以下の通りです。 Array ( [0] => Array ( [create_date] => 2009-03-05 [cnt] => 1 ) [1] => Array ( [create_date] => 2009-03-12 [cnt] => 2 ) [2] => Array ( [create_date] => 2009-03-24 [cnt] => 2 ) 当然の結果なのですがこのように存在する分のデータのみが返って きます。希望としての結果の配列は以下のような感じで Array ( [0] => Array ( [create_date] => 2009-03-01 [cnt] => 0 ) 中略・・・ [4] => Array ( [create_date] => 2009-03-05 [cnt] => 1 ) 中略・・・ [11] => Array ( [create_date] => 2009-03-12 [cnt] => 2 ) 中略・・・ [23] => Array ( [create_date] => 2009-03-24 [cnt] => 2 ) 中略・・・ [30] => Array ( [create_date] => 2009-03-31 [cnt] => 0 ) のように比較する日付のデータがあればカウントしなければcntに nullではなく0を入れたいのですがどうすればいいでしょうか? もしくはPHPにて処理するべき事なのか方法が思いつきません。

    • 締切済み
    • PHP
  • SQL ORDER BY句に別名を指定

    SQL初心者です。 よろしくお願い致します。 Oracle SQLのORDER BY句で日本語の別名と英字の別名とでは処理速度が変わるのでしょうか。 例えば、給与から控除額を引いて税抜き給与支給額の多い順に並べたい場合に 以下のようなSQLを検討しました。 ORDER BY句にはSELECT内の計算結果の別名を指定しました。 その結果、処理が遅くなる感じがしました。 代わりに、"税抜き給与支給額"をSIKYU_GAKと英字にすると早くなった気がしました。 日本語の別名と英字の別名とでは処理速度が異なるものでしょうか。 SELECT t1.ID AS "社員ID" ,t1.NAME AS "社員名" ,t1.KYUYO AS "給与" ,t1.ZEI AS "税金" ,t1.OTHER AS "その他" ,(t1.KYOYO - t1.ZEI - t1.OTHER) AS "税抜き給与支給額" FROM 社員 t1 ORDER BY "税抜き給与支給額"

このQ&Aのポイント
  • 光BBユニット(EWMTA2.4)に交換してから、パソコンだけWi-Fiが繋がりません。近所のSSIDは表示されるが、接続できない問題が発生しています。
  • パソコンのWi-Fi接続ができない場合、光BBユニットの設定を確認する必要があります。設定が正しく行われていない場合、接続できないことがあります。
  • Wi-Fi接続ができない場合、まずはパソコンと光BBユニットの距離が離れすぎていないか確認してください。また、SSIDやパスワードの入力が間違っていないかも確認しましょう。
回答を見る