1

VARCHARフィールドをGROUP BYしようとしているときに奇妙な動作を目撃しました。

次の例では、過去に少なくとも 1 回は名前を変更した顧客を見つけようとしています。

CREATE TABLE #CustomersHistory
(
Id INT IDENTITY(1,1),
CustomerId INT,
Name VARCHAR(200)
)

INSERT INTO #CustomersHistory VALUES (12, 'AAA')
INSERT INTO #CustomersHistory VALUES (12, 'AAA')
INSERT INTO #CustomersHistory VALUES (12, 'BBB')
INSERT INTO #CustomersHistory VALUES (44, '444')

SELECT ch.CustomerId, count(ch.Name) AS cnt
  FROM #CustomersHistory ch
  GROUP BY ch.CustomerId  HAVING  count(ch.Name) != 1

奇妙な結果 (最初の INSERT の「AAA」が 2 番目の INSERT とは異なるかのように)

CustomerId  cnt  //  (I was expecting)
12          3    //   2
44          1    //   1
  • この動作は T-SQL に固有のものですか?
  • なぜこの直感に反する振る舞いをするのでしょうか?
  • この制限をどのように克服するのが通例ですか?

注:この質問は、なぜ答えが見つからなかったvarchar の GROUP BY 問題と非常によく似ています。

補足:HAVING count(ch.Name) != 1の代わりに使用することをお勧めしますHAVING count(ch.Name) > 1か?

4

1 に答える 1

2

演算子は、COUNT()値に関係なくすべての行をカウントします。COUNT(DISTINCT ch.Name)一意の名前のみをカウントするを使用することをお勧めします。

SELECT ch.CustomerId, count(DISTINCT ch.Name) AS cnt
  FROM #CustomersHistory ch
  GROUP BY ch.CustomerId  HAVING  count(DISTINCT ch.Name) > 1

詳細については、オンラインブックのCOUNT()の記事をご覧ください。

于 2013-02-04T17:29:01.473 に答える