#sql-server #tsql
#sql-сервер #tsql
Вопрос:
Как я могу узнать для каждого Track2
, сколько раз он появляется?
INSERT INTO #Temp
SELECT Track2
FROM Knowledge4All..AllMembers
WHERE YEAR(DateCreated) = '2020'
AND UserSiteLastLogin IS NULL
GROUP BY Track2
HAVING COUNT(*) > 2
Комментарии:
1. Просто добавьте
count(*)
в своеselect
заявление — если я чего-то не упускаю?2. Использование имен из трех частей — плохая привычка, которая может привести ко многим проблемам — не делайте этого, если у вас нет особых причин для этого. Кроме того, рекомендуется ВСЕГДА указывать список столбцов в инструкции insert, чтобы избежать проблем при изменении схемы. И начните использовать терминаторы операторов — в конце концов они потребуются.
3.
YEAR()
возвращаетINT
значение — поэтому при сравнении вы НЕ ДОЛЖНЫ заключать сравниваемое значение в одинарные кавычки — используйтеWHERE YEAR(DateCreated) = 2020
вместо этого для правильного числового сравнения4. @marc_s А еще лучше, получите доступный поиск (т.е. используйте индекс), сделав это вместо:
DateCreated >= '2020-01-01' AND DateCreated < '2021-01-01'
Ответ №1:
INSERT INTO #Temp
SELECT T.Track2 ,COUNT(*) AS CountForTrack2 FROM YourTable AS T
WHERE YEAR(T.DateCreated) = 2020 AND T.UserSiteLastLogin IS NULL
GROUP BY T.Track2
HAVING COUNT(*) > 2
Будьте осторожны :
COUNT(*) будет подсчитывать все строки в таблице, включая значения NULL. С другой стороны, COUNT(имя столбца) будет подсчитывать все строки в указанном столбце, исключая значения NULL.
Вы также можете использовать ROW_NUMBER() ПОВЕРХ (PARTITION BY) :
WITH CTE AS
( SELECT Track2,
ROW_NUMBER() OVER(PARTITION BY [YourIDColumn]) AS rn
FROM YourTable
WHERE YEAR(DateCreated) = 2020 AND UserSiteLastLogin IS NULL
)
INSERT INTO #Temp (Track2,CountForTrack2)
SELECT Track2,rn FROM CTE
WHERE rn>2