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
か?