こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

投稿日時 - 2009-07-01 11:41:24

QNo.5089253

困ってます

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

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

投稿日時 - 2009-07-01 12:14:04

お礼

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

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

教えて頂きました方法で書き直し、期待通りの作動と、
すっきりした構造に出来ました。ありがとうございました。

投稿日時 - 2009-07-01 13:53:02

このQ&Aは役に立ちましたか?

5人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(1)

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-