sumやcount関数の挙動について

このQ&Aのポイント
  • sumやcount関数を使用する際に、0の場合はORA-01403: データが見つかりません。エラーが発生することがあります。
  • カウント数を0で返すためには、count関数をネストすることで解決できます。
  • select文だけを切り取りSQLPlusにて実行した場合、レコードが選択されないと「レコードが選択されませんでした」となります。
回答を見る
  • ベストアンサー

sumやcount関数について

いつもお世話になっております。 以下のようなファンクションの中でカウント数を戻り値として返したかったのですが、当然「0」の場合は「0」で返したいのですが、当初以下の場合には「ORA-01403: データが見つかりません。」エラーが発生し上手くいきませんでした。 省略 begin select count(colA) into aaa ~~ group by colB; ret = nvl(aaa,0) return ret; end; 調査のためselect文だけを切り取りSQLPlusにて実行したところ、「レコードが選択されませんでした」となっておりました。 今度は試しに、「select count(count(colA)) into aaa ~~ group by colB;」としたところ、「0」で返ってきましたし、1以上の場合も正しい数値で返ってきました。 同じようにselect文だけを切り取りSQLPlusにて実行したところ、以下のような結果となりました。 count(count(colA)) --------------------- これは、nullという意味になるのでしょうか?? 「レコードが選択されませんでした」との違いはなんなのでしょうか?また、通常PL/SQLにてカウント数=0を返したいときはどのようにするものなのでしょうか?ご教授いただければと思います。 宜しくお願い致します。

  • Oracle
  • 回答数1
  • ありがとう数2

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

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

後者のケースではこちらで試した限りは count(count(colA)) --------------------- 0 というようにゼロが返ってきますね。 ただ、問題はそこよりも「Group By」していることだと思います。 Group Byは条件に合致したレコードに対して行うので、該当するレコードがなければ、キーも存在しないので、NULLになりますが、 Group Byを切らなければ、かならず0が返るはずです。 もし、グルーピングしたColBの件数が取りたくてやっているのであれば、 SELECT COUNT(DISTINCT ColB) FROM ...が普通です。

ryozyryozy
質問者

お礼

ご回答ありがとうございます! SELECT COUNT(DISTINCT ColB) FROM ...で上手くいけました。 ただ、0は返ってこずNULLになりましたが。。

関連するQ&A

  • case when elseとグループ関数の併用について

    こんばんわ! Oracle9iのSQLPlusにて、table_Aテーブルの「AAA」に登録されている値ごとにカウントをとりたいだけなのですが、未入力分のカウントも必要になります。そこで以下のようなSQL文を作りました。 select case when AAA IS NULL then '未入力' else AAA end, count(distinct BBB) from table_A group by GROUPING SETS((AAA),()) 結果は以下のように最後の合計行にも未入力が入ってしまいます。 AAA   count あ   10 い   5 う   6 え   15 お   12 未入力 7 未入力 55 ←GROUPING SETS関数による合計 いろいろ試してみましたがうまくいきません。 どなたかご教授いただけませんでしょうか? 宜しくお願い致します。

  • COUNT(*)の使い方

    COUNT(*)の使い方が分からないので質問します。 直接のSQLでCOUNT(*)を使ってレコード数を表示させることはできましたが PHPでのSQLではCOUNT(*)をPHPのソースの変数に代入する方法が分かりません。 $sql = 'SELECT ip, COUNT(*) FROM webdb'; $ret = mysql_query($sql); $rowval = mysql_fetch_row($ret); この場合、$rowval[1] がテーブルwebdbのレコード数だと 思いましたが、間違っているところはございませんか?

    • ベストアンサー
    • MySQL
  • 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
  • GROUP BY句の集計について

    はじめまして。 いろいろ調べて、何度試しても思うように 結果がでなかったので、投稿させて頂きました。 グループの集計をしてるのですが、 何個のグループがあるのかカウントしたいのです。 aaa bbb 110 a 110 b 111 c 112 d というDBに select aaa, bbb, count(*) as cnt from database GROUP BY aaa ORDER BY aaa だとそのグループ内の該当レコード数がカウントされてしまいます。 上記の例だとグループ数が“3”と結果を返すようにしたいのです。 では。宜しくお願いします。

    • ベストアンサー
    • MySQL
  • ORACLEでの件数カウント方法

    素人なので教えてください。sqlplusでレコード件数をカウントしたいのですが、チョット特殊なカウント方法なのです。やりたいことは、一回のSQL文で複数カラムのレコード件数をカウントしたいのですが可能でしょうか? 例) a_cdの件数カウントの場合は、 select a_cd,count(*) from abc group by a_cd; で b_cdの件数カウントの場合は、 select b_cd,count(*) from abc group by b_cd; これを一回のSQLで、 a_cdとb_cdの件数をカウント出来ますか?

  • count(*)

    countの使い方で、 select score, count(*) from mydb group by score; のように使う場合に、()の中に*ではなくて数字を入れても結果は同じでした。 数字を入れたサンプルソースは見たことがないのですが、あのかっこの中は*以外を使うことはありますか? select score, count(*) from mydb group by score which count(*) > 3; というのをやりたい場合、正しいSQLはどうなりますか?

    • ベストアンサー
    • MySQL
  • オラクルSQL文のCOUNT関数について

    SELECT COUNT (*) AS XXXX FROM AAA,BBB WHERE AAA.AAA = BBB.BBB AND ・・・・ ・・・・ やりたい事は、AAAテーブルだけのカウントをしたいのですが 現状、BBBのカウントもしてしまいます。 BBBはWHEREでAAAに対して比較だけを 行いたいのですが、この場合どうやったらいいのでしょうか。

  • group by したものをsumしたのですが方法がわかりません。

    ある情報をgroup byしその数をcountし、そのcountした数をsumしたのですがどのようにすればよろしいでしょうか? 例えば DB名 test a | ------ ABA | A | AA | ABA | select a,count(*) count from test group by a; a |count| ------------- ABA | 2 | A | 1 | AA | 1 | このカウントの数字を一回でsumすることは可能でしょうか? 宜しくお願いします。

  • count(1)とcount(*)の違い

    初心者です。 以下のSQL文の違い及びcount(1)の1が何を表しているのか 教えて頂けないでしょうか? select count(*) from table select count(1) from table また、参考しやすいサイト等ありましたら教えて頂けないでしょうか?

  • MySQLにてCOUNTした値を更にCOUNT

    MySQLにてCOUNTした値を、更にCOUNTする事を1回のSQLにて実行する事は可能でしょうか? ※2回のSQL、プログラミングを介する、EXCELで再集計する等でならCOUNTのCOUNTは求められるのですが…1回のSQLでの回答お願いします。 ユーザーIDと課金額のカラムからなる、以下のようなテーブルがあるとします。 buyテーブル user_id,coin 1,100 5,100 10,200 5,200 5,200 17,100 1,100 2,200 23,500 ユーザー毎の課金回数は下記にて求められますが、 SELECT user_id,COUNT(coin) FROM buy GROUP BY id user_id,count(coin) 1,2 2,1 5,3 10,1 17,1 23,1 count(coin)毎の人数というのはどのように求めればいいでしょうか? いわば下記のような集計結果が理想です。 ※このような結果を1回のSQLにて出力するSQLをズバリ今回の例に沿って知りたいです。 count(coin),count(count(coin)) 1,4 2,1 3,1 ■環境 Apache2 MySQL5 PHP5 ご教授よろしくお願いします。

    • ベストアンサー
    • MySQL