ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.3749411 distinct句を使わずレコード総計を求めたい
質問者:shibataro3 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" が含まれている可能性があります。とエラーになってしまいました。
困り度:
  • 暇なときにでも
質問投稿日時:
08/02/06 11:09
この質問に対する回答は締め切られました。

回答良回答20pt

ANo.4 できます。だけではなんですので
オンラインでSQLをテストできるURLを付けておきます。要OTN登録
回答者:MZ-80B
種類:回答
どんな人:一般人
自信:参考意見
回答日時:
08/02/06 14:57
参考URL: http://otn.oracle.co.jp/training/index.html
この回答へのお礼ご回答ありがとうございました。こんなサイトがあったんですね!
用意されていたテーブルを利用して(copy_empというテーブルを使い、manager_idをgroup byしました)実行したところ、重複データを除いたレコード総数が求められました。Oracleと他のDBでこんなに違うのかと驚きました。
ただ、distinct句では18件、group by句では19件とgroup by句のほうで、NULL値もカウントしているようでしたので、もっといろいろ勉強したいと思います。本当にどうもありがとうございました。

回答

ANo.3 手抜きしてうまく伝わってない可能性があるみたいので
select count(count(*)) from 商品DB group by 商品名;
です。
回答者:MZ-80B
種類:回答
どんな人:一般人
自信:参考意見
回答日時:
08/02/06 13:17
この回答への補足早速のご回答ありがとうございます!教えていただいた方法で試してみたのですが、DB2では「列関数 "COUNT" のオペランドに、列関数、スカラー全選択、または副照会が含まれています。」、SQL Serverでは「集計やサブクエリを含む式に対して集計関数を実行することはできません。」というエラーがでてしまいました。
現在Oracleが手元にないので試せず、申し訳ないのですがOracleでは実行できますでしょうか?
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答良回答10pt

ANo.2 select count(1) from 商品DB group by 商品名;
が一番無駄がないかと。
回答者:k_o_r_o_c_h_a_n
種類:回答
どんな人:一般人
自信:参考意見
回答日時:
08/02/06 12:47
この回答への補足ご回答ありがとうございます!試してみたのですが、count(1)というところで、1列目(=商品名)が指定になるらしく、
2
2
1
と結果がでてしまいました。3という結果が出ると嬉しいのですが。
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

ANo.1 count(count(*)) を使います
回答者:MZ-80B
種類:回答
どんな人:一般人
自信:参考意見
回答日時:
08/02/06 11:52
この回答へのお礼この回答にお礼をつける(質問者のみ)