SELECT DISTINCTの結果件数をCOUNTする方法

このQ&Aのポイント
  • SQL SERVER 2005 EXPRESS のストアドプロシージャで、SELECT結果の件数を、変数 @count に取得したいのですが、DISTINCTの引数が複数あるため上手くいきません。
  • テーブル「TBL」から、COMとUSERの組み合わせのリストを抽出し、その件数を取得する方法を教えてください。
  • COUNT DISTINCT(複数項目)ができない場合、この結果の件数を取得する方法はありますか?
回答を見る
  • ベストアンサー

SELECT DISTINCTの結果件数をCOUNTする方法

SQL SERVER 2005 EXPRESS のストアドプロシージャで、 SELECT結果の件数を、変数 @count に取得したいのですが DISTINCTの引数が複数あるのが原因なのか、上手くいきません。 目的はテーブル「TBL」から、COMとUSERの組み合わせの リストを抽出し、その件数を取得する事です。 テーブル名:TBL COM  USER --------------- 001  A 002  A 003  A 001  B 002  A 003  C 「COMとUSERの組み合わせで、重複するものは取らない」のならば  SELECT DISTINCT COM,USER  FROM TBL で、下記のような結果が得られます。 COM  USER --------------- 001  A 002  A 003  A 001  B 003  C で、この結果件数である「5」を取りたいのですが DECLARE @count int  SELECT @count = COUNT(DISTINCT COM,USER)  FROM TBL print @count と打っても失敗します。 ( )の括りやCOUNTの位置をいろいろと試したが出来ませんでした。 COUNT DISTINCT(複数項目)が出来ないのならば、 どうすればこの結果の件数を取得できるでしょうか? どうかご教授授くださいませ。よろしくお願いします。

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

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

COUNT関数は*を除いては複数のフィールドをパラメータに取ることができません。 したがって、2段階でカウントするのが賢明です。 DECLARE @count int SELECT @count = COUNT(*) FROM (SELECT DISTINCT COM,USER FROM TBL) t PRINT @count オマケですが、サブクエリを使わない方法としてはDENSE_RANKを使う方法があります。 まあ、メリットはないですけどね。 DECLARE @count int SELECT TOP 1 @count = DENSE_RANK() OVER (ORDER BY COM,USER) FROM TBL ORDER BY 1 DESC PRINT @count

wendy0303
質問者

お礼

jamshid6さんありがとうございます。 上述のサブクエリの記述は判らなかったので非常に助かりました。 大変勉強になりました。 自分で考えて試したのは、  SELECT DISTINCT COM,USER  FROM TBL のみの別ストアド[GET_LIST]を作成し、  INSERT INTO ##TEMP_TBL EXEC GET_LIST としてその結果を一時テーブルに格納。 その一時テーブルのレコード数をCOUNT(*)で取得する… という、何ともまどろっこしい手順でしたので コードが汚くなっていました。 教えて頂きました方法で書き直し、期待通りの作動と、 すっきりした構造に出来ました。ありがとうございました。

関連するQ&A

  • 2つのテーブルのカウント結果を1行で取得

    以下のようなデータ件数のテーブルが、別々のDBにあります。 SELECT COUNT(*) FROM AA.TBL01 ------ TBL01 ------ 10 SELECT COUNT(*) FROM BB.TBL02 ------ TBL02 ------ 5 それぞれのテーブルのカウント結果を、1行で取得する ことは可能でしょうか? <取得したい結果> ---------------- TBL01 TBL02 ---------------- 10 5 よろしくお願いします。 (SQL Server2005 Standard)

  • DISTINCT + COUNT

    みなさんこんにちは。 以下のようなSQL文のCOUNT関数を作りたいのですが、 うまい手法がわからず困っています。 SELECT DISTINCT Ta.会員ID, Tb.品番 FROM TABLE_A AS Ta LEFT JOIN TABLE_B AS Tb ON Ta.ID = Tb.ID ↑こいつのCOUNTですが、単純に SELECT COUNT(DISTINCT Ta.会員ID, Tb.品番) ~ とやるとエラーになってしまいます。 どうやってやればカウントできるのでしょうか? すごく初歩的なことだと思いますが、 ご助言お願いいたします。

  • SELECT DISTINCT の使いかた

    テーブル名にA1,A2,A3と言う列がありA1内の列の重複を省き 結果をA1,A2,A3全て表示したいのですが方法がわかりません。 どなたかHELP お願いします。 SELECT DISTINCT A1 FROM テーブル

  • DISTINCTの使い方を教えて下さい

    Select 文で DISTINCT を記述すると結果(Count)は-1となってしまいます。 DISTINCTを外すと全件表示されます。 これは何がまずいのでしょうか ? 環境 DB=SQLserver 2000 + IIS 5.0 + ASP 例:Select DISTINCT TABLE1,TABLE2,TABLE3 FROM TABLE ちなみにdbをAccess で使用している時とクエリアナライザではOKでした。

  • COUNT(DISTINCT *)がエラーになる理由を教えてください

    以下のSQL文がエラーとなるのはなぜですか? SELECT COUNT(DISTINCT *) FROM 社員 SELECT DISTINCT * FROM 社員 ならエラーにならないのにどうしてでしょうか

  • Select Distinctについて

    SQL文の質問です。フィールドがTable1に100つあるとします。 select distinct XYZ From Table1という文があるとします。 これだとXYZのフィールドしか参照していないことになると思います。 そうではなくて、他の99フィールドの値も参照(データにアクセスしたい)したいと思っています。 select distinct XYZ, * From Table1とSelect * from Table1みたいなことをやりましたがエラーが発生しました。他の99フィールドを参照する方法はあるでしょうか?

  • 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
  • COUNTの使い方

    MySQL4.0.26とPHPを使ってとあるシステムを構築しています。 AとBというテーブルがあって、それぞれのテーブルに登録してあるレコード数の合計を求めたいのですが、こういう場合はできるのでしょうか? SELECT count(*) FROM テーブルAでテーブルAのレコード数は求められますが、SELECT COUNT(*) FROM テーブルA、テーブルBとするとおかしな件数になってしまいます。 できれば一つのクエリで処理したいと思っているのですが。 初心者的質問ですいません。宜しくお願いします。

  • イコールとノットイコール条件による件数結果

    以下3つのSQLを実行した場合に検算が 合わないのですがどのように解釈して いいのでしょうか。 (1)の件数+(2)の件数 = (3)の件数になると 考えては駄目ですか? (1) select count(A.*) from tbl_a A,tbl_b B where A.komoku1 = B.komoku1 and A.komoku2 = B.komoku2 and A.komoku3 = B.komoku3 (2) select count(A.*) from tbl_a A,tbl_b B where A.komoku1 = B.komoku1 and A.komoku2 = B.komoku2 and A.komoku3 <> B.komoku3 (3) select count(A.*) from tbl_a A,tbl_b B where A.komoku1 = B.komoku1 and A.komoku2 = B.komoku2

  • コマンドプロンプト 複数の実行結果を変数に

    複数のテーブルのデータ件数を取得して変数に入れ、result.txtに結果を出力したいのですが、下のように書くと、1つのテーブルのデータ件数しか出力されません。複数の結果を出力するにはどうしたらよいか教えてください。 for /f %%z in ('mysql -u root -p ^< "c:\bat\test.sql"') do set count=%%z echo result: %count% >> "c:\bat\result.txt" test.sqlの中身を、 select count(*) from table1; select count(*) from table2; select count(*) from table3; とすると何も出力されず、 select count(*) from table1; とすると、1つの結果だけ出力されます。

    • ベストアンサー
    • MySQL