2

問題を実証するためのテストテーブルがあります。

Id  NetworkId   CountryCode
1       1           de
2       2           de
3       2           de
4       2           de
5       1           us
6       1           us
7       1           us
8       2           us

次のようなものを出力する必要があります。

NetworkId   CountryCode    DistCount
    1           de              1
    2           de              3
    1           us              3
    2           us              1

試行されたクエリ

SO でいくつかの回答を探しましたが、必要なものを正確に見つけることができませんでした。最初の関連する質問と私が試したクエリは次のとおりです。

クエリ:

SELECT NetworkId, CountryCode, COUNT(*) as DistCount
FROM (SELECT DISTINCT NetworkId, CountryCode FROM TestTable) AS FOO
GROUP BY NetworkId, CountryCode

結果:

NetworkId   CountryCode    DistCount
    1           de              1
    1           us              1
    2           de              1
    2           us              1

クエリ:

SELECT COUNT(DISTINCT(STR(NetworkId) + ',' + STR(CountryCode)))
FROM TestTable

結果:

Msg 8114, Level 16, State 5, Line 1
Error converting data type nvarchar to float.

この質問の回答も試しました:クエリを繰り返さずに個別の複数フィールドをカウントするにはどうすればよいですか?

クエリ:

SELECT 
   NetworkId, 
   CountryCode,
   COUNT(*) OVER(PARTITION BY NetworkId, CountryCode) as DistCount
FROM TestTable
GROUP BY NetworkId, CountryCode

結果:

NetworkId   CountryCode    DistCount
    1           de              1
    1           us              1
    2           de              1
    2           us              1

おわかりのように、これを行う方法を理解するのに苦労しています...比較的単純であるべきだと思いますが、何かが欠けています。

4

2 に答える 2

3

私が間違っていない限り、これはうまくいくでしょう:

SELECT NetworkId, CountryCode, COUNT(Id) as DistCount
FROM TestTable
GROUP BY NetworkId, CountryCode
于 2012-12-11T00:04:51.027 に答える
3

Id が一意で、TestTable 内で null でない場合 (主キーの場合はそうなる)、このクエリは指定した結果セットを返します。

SELECT NetworkId, CountryCode, Count(1) AS DistCount
  FROM TestTable 
 GROUP BY NetworkId, CountryCode
 ORDER BY NetworkId, CountryCode

ただし、列が一意ではなく、各グループ内Idの個別の非 null 値の数が必要な場合は、DISTINCT キーワードを追加できます。Id

SELECT NetworkId, CountryCode, Count(DISTINCT Id) AS DistCount
  FROM TestTable 
 GROUP BY NetworkId, CountryCode
 ORDER BY NetworkId, CountryCode

サンプル データを指定すると、両方のクエリで同じ結果が返されます。Idグループ内に重複する値がある場合にのみ違いがあります。

于 2012-12-11T00:05:17.440 に答える