Я стал свидетелем странного поведения при попытке GROUP BY поля VARCHAR.
Возьмем следующий пример, где я пытаюсь определить клиентов, которые хотя бы раз меняли имя в прошлом.
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 отличалось от второго)
CustomerId cnt // (I was expecting)
12 3 // 2
44 1 // 1
- Является ли это поведение характерным для T-SQL?
- Почему он ведет себя таким довольно нелогичным образом?
- Как принято преодолевать это ограничение?
Примечание. Этот вопрос очень похож на проблему GROUP BY с varchar, где я не нашел ответа на вопрос Почему
Примечание: рекомендуется ли использовать HAVING count(ch.Name) != 1
вместо HAVING count(ch.Name) > 1
?