• ベストアンサー
  • 困ってます

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

  • 質問No.5089253
  • 閲覧数26965
  • ありがとう数6
  • 気になる数0
  • 回答数1
  • コメント数0

お礼率 89% (81/91)

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(複数項目)が出来ないのならば、
どうすればこの結果の件数を取得できるでしょうか?
どうかご教授授くださいませ。よろしくお願いします。

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

  • 回答No.1
  • ベストアンサー

ベストアンサー率 88% (591/669)

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

お礼率 89% (81/91)

jamshid6さんありがとうございます。
上述のサブクエリの記述は判らなかったので非常に助かりました。
大変勉強になりました。

自分で考えて試したのは、
 SELECT DISTINCT COM,USER
 FROM TBL
のみの別ストアド[GET_LIST]を作成し、
 INSERT INTO ##TEMP_TBL EXEC GET_LIST
としてその結果を一時テーブルに格納。
その一時テーブルのレコード数をCOUNT(*)で取得する…
という、何ともまどろっこしい手順でしたので
コードが汚くなっていました。

教えて頂きました方法で書き直し、期待通りの作動と、
すっきりした構造に出来ました。ありがとうございました。
投稿日時:2009/07/01 13:53
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,600万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ