web-dev-qa-db-ja.com

SQLカウント(*)と個別

SQLでcount(distinct *)を使用できないのはなぜですか?すべての異なる行を数えるのと同じように?

17
Nitish Upreti
select count(*) from (select distinct * from MyTable) as T

ただし、DISTINCTを使用するクエリを再考することを強くお勧めします。多くの場合、GROUP BYがより適切です(そしてより高速です)。

編集:質問のコメントを読んだ後、私はあなたがすべきであることを指摘する必要があります決して結果を得るために実際に必要な作業よりも多くの作業を行うDBMS。テーブルに重複する行がないことが事前にわかっている場合は、DISTINCTを使用しないでください。

32

テーブル内のすべての列を選択して、...でグループ化できます。

SELECT column1, column2, column3, count(*)
FROM someTable
GROUP BY column1, column2, column3
10
Jason Punyon

何故なの?

select 
  count(distinct name)
from 
  people
4
silent

あなたは確かにできます。

ただし、識別子を持っている場合は、完全に異なる行はありません。しかし、あなたは例えばすることができます:

SELECT COUNT(DISTINCT SenderID) FROM Messages
1
David Hedlund

Sql Server2005でCTEを試すことができます

;WITH cte AS (
        SELECT  DISTINCT Val1,Val2, Val3
        FROM    @Table
)
SELECT  COUNT(1)
FROM    cte

質問に答えるには、ドキュメントから

テーブル内の行の総数を返すために、すべての行をカウントする必要があることを指定します。 COUNT()はパラメーターを受け取らず、DISTINCTでは使用できません。COUNT()は、定義上、特定の列に関する情報を使用しないため、式パラメーターを必要としません。 COUNT(*)は、重複を削除せずに、指定されたテーブルの行数を返します。各行を個別にカウントします。これには、NULL値を含む行が含まれます。

0
Adriaan Stander

COUNT(*)は、クエリに一致する行の数です。

行には、ROWIDなどの一意の情報が含まれます。すべての行は定義上区別されます。

代わりに、いくつかのフィールドで値の個別のインスタンスをカウントする必要があります。

0
Will