Написанный вами запрос будет работать (если вы исправите имена столбцов - ваш запрос использует разные имена столбцов для отправленных вами образцов данных).Это может быть упрощено визуально с помощью COUNT(*)
в предложении HAVING
.COUNT работает с любыми ненулевыми значениями и накапливает 1 для ненулевых значений или 0 для нулевых значений, но в этом случае не имеет смысла использовать YEAR внутри счетчика, поскольку все даты не равны NULL и счетчик не заинтересован вздесь значение - count(*), count(1), count(0), count(member)
будет работать одинаково
Единственное время count(column)
работает иначе, чем count(*)
, когда column
содержит нулевые значения.Существует также опция COUNT, в которой вы ставите DISTINCT
в скобках, и это приводит к тому, что при подсчете игнорируются повторяющиеся значения.
COUNT DISTINCT для столбца таблицы, содержащего 6 строк значений 1, 1, 2, null, 3, 3
вернет 3 (3 уникальных значения).Если COUNT в том же столбце вернет 5 (5 ненулевых значений), COUNT (*) вернет 6
. Вы должны понимать, что, поместив ГОД (...) в группу, но не выбрав, выможет привести к появлению дублированных строк в выводе.Например, если у вас также есть эти строки:
Member, Code, Date
1234, G0443, 1-1-19
1234, G0443, 2-1-19
И вы группируете по году (но не показываете его), тогда вы увидите:
1234, G0443 --it's for year 2018
1234, G0443 --it's for year 2019
Лично я так думаюБыло бы удобно показывать год в списке выбора, чтобы вы могли лучше определить, где проблема, но если вы хотите сжать эти дублирующиеся строки, выполните SELECT DISTINCT. Альтернативно, используйте разницу между count и count различным: удалитегод от GROUP BY и вместо этого произнесите HAVING COUNT(*) > COUNT(DISTINCT YEAR(ServiceDate))
Как обсуждалось выше, число (*) будет больше, чем число, отличное от года, если есть дублированные годы