СЧИТАЙТЕ с условием группы, имея в SQL

#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