Станах свидетел на странно поведение, докато се опитвах да ГРУПИРАМ ПО поле 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
Което странно дава (сякаш "AAA" от първия 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
?