count()
を使用する場合 SQLiteで機能する場合、個別の値のみをカウントしたい状況に陥る可能性があります。つまり、重複する値が複数回カウントされることは望ましくありません。
つまり、列に同じ値が複数回ある場合は、その値を1回だけカウントする必要があります。
デフォルトでは、count()
計算にはすべての重複する値が含まれます。たとえば、値「Cat」が3回出現する場合、count()
それを3としてカウントします。
ただし、個別の値のみをカウントする場合は、count()
1としてカウントされます。
幸い、これを行う簡単な方法があります。 DISTINCT
を追加するだけです。 count()
のキーワード 働き。このように:
count(DISTINCT x)
ここでx
カウントするコンテンツの列名(またはアスタリスクワイルドカードを使用している場合は行全体)です。
例
次の表を見てください:
ProductId ProductName Price ---------- ------------- ---------- 1 Widget Holder 139.5 2 Blue Widget 10.0 3 Red Widget 10.0 4 Green Widget 10.0 5 Widget Stick 89.75 6 Foo Cap 11.99
行2から4はすべて同じ価格(10.0)であることに注意してください。
通常のcount()
を実行すると 価格 列、6行すべてをカウントします。
SELECT count(Price) FROM Products;
結果:
6
ただし、DISTINCT
を追加すると キーワードの場合、これらの3行を1つとしてカウントします。
SELECT count(DISTINCT Price) FROM Products;
結果:
4
個別の行をカウント
count()
関数はアスタリスクワイルドカード(*
)を受け入れます )、これはすべての行をカウントすることを意味します。
ただし、DISTINCT
を使用しようとすると、エラーが発生する可能性があります アスタリスクワイルドカードを使用する場合。
これは、行が重複しているテーブルです。
Postal State ---------- ------------------ NSW New South Wales NSW New South Wales QLD Queensland TAS Tasmania SA South Australia WA Western Australia VIC Victoria
理論的には、DISTINCT
を使用できるはずです。 このテーブルの「重複排除された」行をカウントします。ただし、それは不可能のようです。
SELECT count(DISTINCT *)
FROM States;
結果:
Error: near "*": syntax error
代わりに、DISTINCT
を使用するときに列名を指定する必要があります キーワード。
SELECT
count(State),
count(DISTINCT State)
FROM States;
結果:
count(State) count(DISTINCT State) ------------ --------------------- 7 6>
別の方法は、次のようなことです。
SELECT count(*) FROM (SELECT DISTINCT * FROM States);
結果:
6
ただし、このような重複行を許可するデータベース設計は一般的に適切ではないため、これは実際には問題にはなりません。