• ベストアンサー

distinct句を使わずレコード総計を求めたい

DB初心者です。 DISTINCT句を使わずに、group by句を使って 重複データを除いたレコード総計を求めたいと思い、 下記の用にSQL文を書いたのですがうまくいきません。 oracleではなく、DB2を使っているのですがSQL文として 可能なのか教えていただければと思い質問を致しました。 <例> テーブル名:商品DB 商品名 a a b b c だったら、重複を除いたレコード数は3になりますが、 select count(*) from 商品DB group by 商品名 とすると 2 2 1 となり、それぞれの商品の合計数が出てしまうので select count(*) from ( select 商品名 from 商品DB group by 商品名) と副問合せ(でよいのでしょうか?)をしてみると 入力が予想されるトークンには "AS" が含まれている可能性があります。とエラーになってしまいました。

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

  • ベストアンサー
  • MZ-80B
  • ベストアンサー率56% (46/81)
回答No.4

できます。だけではなんですので オンラインでSQLをテストできるURLを付けておきます。要OTN登録

参考URL:
http://otn.oracle.co.jp/training/index.html
shibataro3
質問者

お礼

ご回答ありがとうございました。こんなサイトがあったんですね! 用意されていたテーブルを利用して(copy_empというテーブルを使い、manager_idをgroup byしました)実行したところ、重複データを除いたレコード総数が求められました。Oracleと他のDBでこんなに違うのかと驚きました。 ただ、distinct句では18件、group by句では19件とgroup by句のほうで、NULL値もカウントしているようでしたので、もっといろいろ勉強したいと思います。本当にどうもありがとうございました。

その他の回答 (3)

  • MZ-80B
  • ベストアンサー率56% (46/81)
回答No.3

手抜きしてうまく伝わってない可能性があるみたいので select count(count(*)) from 商品DB group by 商品名; です。

shibataro3
質問者

補足

早速のご回答ありがとうございます!教えていただいた方法で試してみたのですが、DB2では「列関数 "COUNT" のオペランドに、列関数、スカラー全選択、または副照会が含まれています。」、SQL Serverでは「集計やサブクエリを含む式に対して集計関数を実行することはできません。」というエラーがでてしまいました。 現在Oracleが手元にないので試せず、申し訳ないのですがOracleでは実行できますでしょうか?

回答No.2

select count(1) from 商品DB group by 商品名; が一番無駄がないかと。

shibataro3
質問者

補足

ご回答ありがとうございます!試してみたのですが、count(1)というところで、1列目(=商品名)が指定になるらしく、 2 2 1 と結果がでてしまいました。3という結果が出ると嬉しいのですが。

  • MZ-80B
  • ベストアンサー率56% (46/81)
回答No.1

count(count(*)) を使います

関連するQ&A