- ベストアンサー
COUNTの取得方法(?)について質問があります。
COUNTの取得方法(?)について質問があります。 現在次のSQL文を投げると SELECT ITEM ,COUNT(ITEM) FROM ITEM_MASTER WHERE ITEM IN ('000', '100', '200', '300', '400') GROUP BY ITEM ORDER BY ITEM ; このような結果が返ってきます。 ITEM COUNT(ITEM) ------ ----------- 100 9 200 2 300 1 ITEMの値が000と400の件数は0件なのですが、0件の場合には、 次のように0と表示したい場合はどのようにしたら良いのでしょうか? ITEM COUNT(ITEM) ------ ----------- 000 0 <--ここ 100 9 200 2 300 1 400 0 <--ここ よろしくお願いします。
- taru73
- お礼率75% (3/4)
- Oracle
- 回答数2
- ありがとう数1
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
対象データが存在しないモノは抽出のしようがありません。 どこにも存在しないのであれば、便宜上作るしかありません。 selec ITEM,COUNT(*) from ITEM_MASTER, ( select '000' as KEY from dual union all select '100' as KEY from dual union all select '200' as KEY from dual union all select '300' as KEY from dual union all select '400' as KEY from dual ) M where ITEM=M.KEY group by ITEM order by ITEM ; 抽出条件も兼ねたインラインビューとしています。
その他の回答 (1)
- naochancom
- ベストアンサー率61% (41/67)
ITEM_MASTER<--このテーブルはマスタになるのでしょうか? もし、トランザクションであれば、マスタテーブルと結合してデータ取得が可能だと思います。 [ITEM_MASTER] ITEM data 100 aa 100 bb 200 cc [MASTER] ITEM NAME 000 ITEM0 100 ITEM1 200 ITEM2 300 ITEM3 のテーブルが存在しているのであれば、 SELECT A.ITEM ,COUNT(B.ITEM) FROM MASTER A left join ITEM_MASTER B on (A.ITEM = B.ITEM) WHERE A.ITEM IN ('000', '100', '200', '300', '400') GROUP BY A.ITEM ORDER BY A.ITEM こんな感じだったらいけると思いますが、、どうでしょう?
補足
回答ありがとうございます。 残念ながら、というかITEM_MASTERはトランザクション ではなく、マスターテーブルなのです。
関連するQ&A
- count(*)のcountをとりたい
現在、以下のようなテーブルを扱っているのですが、 +---------+ |accountid| +---------+ | 999| | 999| | 638| | 638| | 638| | 999| | 999| | 638| +---------+ を、ユニークな件数でとろうとしています。 現在は > select count(*) from TABLE group by accountid; +----------+ | count(*)| +----------+ | 4| | 4| +----------+ 2 rows in set (0.00 sec) などとして、「2 rows in set」を読むと言う方法なのですが、それだと人の手を介さないといけないのでどうにか出力結果をダイレクトに取得したいのです。 SQLサーバで使えるらしい select count(*) from (select count(*) from TABLE group by accountid) as AA; と言うSQL文を使っても無理だったので、どなたか方法をご存じないでしょうか???
- ベストアンサー
- MySQL
- 1個のSQL分で2種類以上の件数値を取得する
SQL分の記述で質問なんですが、 データベース上に日付、時間、フラグと言う項目があります。 同一の日付、時間のものは数件ずつあります。 フラグは"b"と"1"があります。 このデータの日付・時間辺りの件数と+フラグが"1"の件数を同時に取得するSQL分はかけますでしょうか? 別々ならば、 SELECT DATE,TIME,COUNT(*) AS KENSU1 FROM W_TABLE GROUP BY DATE,TIME ORDER BY DATE,TIME と SELECT DATE,TIME,COUNT(*) AS KENSU2 FROM W_TABLE WHERE FLG="1" GROUP BY DATE,TIME ORDER BY DATE,TIME でかけると思うのですが、 1個のSQL分で記述は可能でしょうか? 処理結果を 05/02/23 12:00 10 5 05/02/24 10:00 12 3 (日付・時間・件数・フラグ="1"の件数 見たいに取得したいのですが..
- ベストアンサー
- Oracle
- 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 としなければならないのでしょうか
- ベストアンサー
- PostgreSQL
- 動的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でした。 なので、件数が取得出来ていないようです。 オラクルエラーにもならず、次の処理へ流れていってしまいます。 知っている方、教えてください。
- 締切済み
- その他(プログラミング・開発)
- GROUP BYを使用したCOUNT
いつもお世話になっております。 現在下記のようなSQLを発行していまして、 件数を取得したいのですが、取得データの結果が 0件以外の時は良いのですが、0件の時は 「レコードが選択されませんでした」と表示されてしまいます。 何とか0件で表示できないでしょうか? SELECT COUNT(*) FROM T_M_MAKER HAVING MAKER_CD = '010' GROUP BY MAKER_CD 苦し紛れに SELECT DECODE(COUNT(*),'',0,COUNT(*)) FROM T_M_MAKER HAVING MAKER_CD = '010' GROUP BY MAKER_CD というのもやってみましたが、結果は一緒でした。 どなたかお分かりになる方、回答をお願いします。
- ベストアンサー
- その他(データベース)
- SQL 件数取得を速くしたい
SQLでテーブルなどからSELECTされた件数を得る際に、 select count(*) from ~ 等とするかと思いますが、この結果が返ってくるのが遅くて困っています。 少しでも速く件数を得たいのですがどのような方法がありますでしょうか? 教えてください。 私が使っている環境はOracle 8iで 特に今回はgroup byを含むビューからの検索を行おうとしています。
- ベストアンサー
- その他(データベース)
- MySQLのcountを使って件数を表示したい
お世話になります。 MySQL・PHPで検索のプログラムを作成しています。 検索結果の件数についてわからないところがあって質問させていただきました。 どうぞよろしくお願いします。 place・・・エリア 1,2,3,4,5,6・・・と番号が入っています。 1番が大阪、2番が東京・・・のような感じで割り振っています。 欲しい結果は、 大阪(100件) 東京(6524件)・・ ・のような形で、countした値をカッコ内に件数として表示させたいと思っております。 SELECT place,count(*) FROM test_tbl where place IN (1,2,3) GROUP BY place WITH ROLLUP; if(!($rs = mysql_query($query))) { print $query; print "クエリー失敗"; } このような感じで地域をグループ化して件数を表示させたいのですが、 1のエリアも2のエリアも3のエリアも該当するデータがない場合、「0件」という結果が欲しいのですが、 SQLのエラーが帰ってきてしまいます。 「失敗」の部分に「0」を入れれば0件になると思うんですが、こんなふうにしていいものか悩んでいます。 エラーはエラーで表示させたいんですが・・・。 そもそも、考え方自体が間違えてるのか、それとも他の方法があるのか・・・ 全く想像できない状態です。 どうか、アドバイスよろしくお願いします。
- 締切済み
- PHP
- forで無限ループになっていないかどうか
各アイテムの最新3件だけデータベースに残したいと思い、下記のようにしてみました。 動作を確認したところ問題なかったのですが、何か(無限ループする可能性があるなど)問題があるようでしたら、ご指摘いただけないでしょうか。 よろしくお願いいたします。 for ($num = 1; $num < 21; $num++){ // アイテムが20件ある場合 $sql = "SELECT COUNT(id) AS cnt FROM item where item_id=$num ;"; $res = mysql_query($sql, $conn) or die; $row = mysql_fetch_array($res, MYSQL_ASSOC); $count = $row["cnt"]; if($count<3){ // アイテムが3件より少なかったら何もしない } else{ $delete_count=$count-3; $sql = "delete from item where item_id=$num order by date limit $delete_count;"; $res = db_query($sql, $conn); } }
- ベストアンサー
- PHP
- SQLのcount()とgroup by
以下のようなテーブルがあったとき、 tbl1 id | score 1 | 100 1 | 200 1 | 300 2 | 200 2 | 100 3 | 300 3 | 400 3 | 500 3 | 600 idでまとめて個数を出すとすると、 SELECT count(*) FROM tbl1 group by id とすれば count(*) 3 2 4 と結果が返ってきますが、この結果にidを足して id | count(*) 1 | 3 2 | 2 3 | 4 というようなSQLはどうやって書けばいいのでしょうか? MySQLでは、 SELECT id, count(*) FROM tbl1 group by id と書けるのですが、これは標準的なSQLではNGなそうなので、気になって質問しました。 よろしくお願いします。
- ベストアンサー
- その他(データベース)
お礼
ありがとうございました。解決しました。 回答頂いたままだと結果は変わりませんでしたが、 次のように修正した所、思い通りの結果が得られ ました。 SELECT M.ITEM ,COUNT(I.ITEM) FROM ( SELECT '0000' AS ITEM FROM DUAL UNION ALL SELECT '1000' AS ITEM FROM DUAL UNION ALL SELECT '2000' AS ITEM FROM DUAL UNION ALL SELECT '3000' AS ITEM FROM DUAL UNION ALL SELECT '5000' AS ITEM FROM DUAL ) M LEFT JOIN ITEM_MASTER I ON M.ITEM = I.ITEM GROUP BY M.ITEM ORDER BY M.ITEM