2

次の3つのコードフラグメントの結果は、関数COUNT()の括弧内にどのパラメーターが含まれていても同じであることがわかります。なぜですか?

SELECT Category.Category, Category.CategoryID, COUNT(Category) AS Popularity
FROM FavCategory INNER JOIN Category
ON FavCategory.CategoryID= Category.CategoryID
GROUP BY Category, Category.CategoryID
HAVING COUNT(FavCategory.MemberID)>=2;

SELECT Category.Category, Category.CategoryID, COUNT(FavCategory.CategoryID) AS Popularity
FROM FavCategory INNER JOIN Category
ON FavCategory.CategoryID= Category.CategoryID
GROUP BY Category, Category.CategoryID
HAVING COUNT(FavCategory.CategoryID)>=4;

SELECT Category.Category, Category.CategoryID, COUNT(FavCategory.MemberID) AS Popularity
FROM FavCategory INNER JOIN Category
ON FavCategory.CategoryID= Category.CategoryID
GROUP BY Category, Category.CategoryID
HAVING COUNT(FavCategory.MemberID)>=2;

SELECT Category.Category, Category.CategoryID, COUNT(FavCategory.MemberID+Category.CategoryID) AS Popularity
FROM FavCategory INNER JOIN Category
ON FavCategory.CategoryID= Category.CategoryID
GROUP BY Category, Category.CategoryID
HAVING COUNT(FavCategory.MemberID)>=2;

これがCategoryテーブルとFavCategoryテーブルのレコードです ここに画像の説明を入力してください

4

4 に答える 4

2

あなたはその理由について尋ねています。COUNTフィールド/式がnullまたはnullでないかどうかに応じてカウントされるため、これらはすべて同じです。値がnullでない場合は、COUNTカウントします。nullの場合、それは無視されます

テーブルにnullがないため、3つのクエリすべてが同じ値を報告します。COUNT('DRACULA')、、またはを試してみてください。CategoryID3の場合COUNT(42)3、CategoryID 1の場合は2とカウントされ、3つのクエリと同じように機能します。COUNT(0)COUNT(-1)

もちろん、を使用COUNT(*)している場合にも使用できますINNER JOINので、お勧めします。を使用している場合、LEFT JOINを使用するのは正しくありません。次のようCOUNT(*)にする必要がありますCOUNT(secondTable.foreignKeyColumnHere)。または、Accessがカーディナリティに基づくカウントをサポートしている場合(Postgresqlのように)、次のようにします。COUNT(secondTable.*)

その適切な使用に関するカウントと啓蒙の入門書(プラグアラート)については、http://www.ienablemuch.com/2010/04/debunking-myth-that-c​​ountdracula-is.htmlでカウントに関する私の投稿を読んでください。


@JDein

このデータを考えると:

create table Person
(
  PersonId int not null primary key, 
  Name varchar(100) not null, 
  Middlename varchar(100) null
);

insert into Person(PersonId,Name,MiddleName) values
(1,'John','Winston'),
(2,'Paul','James'),
(3,'George',NULL),
(4,'Ringo','Parkin');

これらはすべて4を返します。

select count(PersonID) from Person;

select count(Name) from Person;

select count(*) from Person;

select count(1) from Person;

select count(0) from Person;

select count(2) from Person;

select count(-1) from Person;

select count(42) from Person;

select count('Dracula') from Person;

以下を除いて、これは3を返します。

select count(MiddleName) from Person;

ライブテスト:http ://www.sqlfiddle.com/#!3 / c1b1e / 8

于 2012-05-23T06:30:55.587 に答える
1

結果で人気をより簡単に確認したい場合はORDER BY、COUNT 列で結果を並べ替える句を追加する必要があります。

SELECT
  Category.Category,
  Category.CategoryID,
  COUNT(FavCategory.MemberID) AS Popularity
FROM FavCategory INNER JOIN Category
ON FavCategory.CategoryID= Category.CategoryID
GROUP BY Category, Category.CategoryID
HAVING COUNT(FavCategory.MemberID)>=2
ORDER BY Popularity DESC;

おそらく、お気に入りのカテゴリに含まれていないカテゴリも含めたいと思うでしょう。その場合、結合の両側を置き換えINNER JOINて交換する必要があります。LEFT JOIN

SELECT
  Category.Category,
  Category.CategoryID,
  COUNT(FavCategory.MemberID) AS Popularity
FROM Category LEFT JOIN FavCategory
ON FavCategory.CategoryID= Category.CategoryID
GROUP BY Category, Category.CategoryID
ORDER BY Popularity DESC;

この場合、結合されたテーブルの ( FavCategory) 列 (MemberID上記の例) のいずれかの値をカウントすることが重要であることにも注意してください。一部のカテゴリが に一致しない場合FavCategoriesMemberIDは NULL になり、結果として COUNT でカウントされません。

于 2012-05-23T06:52:55.303 に答える
1

私の推測では、実際には列の個別の値を求めていると思います。その場合は次を使用します。

COUNT(DISTINCT (FavCategory.CategoryID))

(等)。

COUNTのSQL Serverドキュメントから(使用しているデータベースを指定していません):

COUNT(ALL 式) は、グループ内の各行の式を評価し、null 以外の値の数を返します。

(DISTINCT ではなく、ALL がデフォルトだと思います。)

テーブル内の値が null でない場合、式を使用するだけCOUNT(*)で、グループの行数が返されます。そのため、すべての式で同じ結果が得られます。

明確な結果が得られなかった場合は、何を達成しようとしているのかを説明してください。別の方法を提案できる場合があります。(まあ、他の誰かができるかもしれません - SQL の初心者である私はできないと思います。)

于 2012-05-23T05:55:18.743 に答える
0

Category、Category.CategoryID の組み合わせの行数を取得しようとしています。これらが意味することは、DB がこれら 2 つの列のすべての unq の組み合わせを作成し、これらの各 unq の組み合わせの行数を出力することです。group 句と where 句に同じ列がある場合、行数は変わりません。行数に影響を与える可能性がありますが、データがないと、影響があるかどうかを判断するのは非常に困難です

于 2012-05-23T06:09:43.117 に答える