Как подсчитать несколько разных полей без повторения запроса?

У меня есть запрос с несколькими группировками, который возвращает количество в месяц. Что-то вроде этого:

SELECT field1, field2, year(someDate), month(someDate), count(*) as myCount
FROM myTable
WHERE field5 = 'test'
GROUP BY field1, field2, year(someDate), month(someDate)

Проблема в том, что я хочу, чтобы количество было различаться в день, на основе поля идентификатора + поле даты (без времени). Например, я хочу получать различное количество идентификаторов каждый день в месяц. Итак, я хочу что-то вроде этого:

SELECT field1, field2, year(someDate), month(someDate), 
       count(distinct someID, someDate) as myCount
FROM myTable
WHERE field5 = 'test'
GROUP BY field1, field2, year(someDate), month(someDate)

Есть 2 проблемы с этим:

Вы не можете перечислить 2 отдельных поля для совокупности подсчетаЭто также будет включать в себя время даты, поэтому оно не будет ничего фильтровать, так как почти всегда будет иметь другое время

Я легко могу позаботиться о 2., преобразовав в varchar только дату, но я не уверен, как справиться с проблемой нескольких различных полей. Я не могу использоватьэто решение, так как я не хочу повторять весь оператор where и group by. Вот что я придумал:

SELECT field1, field2, year(someDate), month(someDate), 
       count(distinct someID + CONVERT(VARCHAR, someDate, 112)) as myCount
FROM myTable
WHERE field5 = 'test'
GROUP BY field1, field2, year(someDate), month(someDate)

Вместо того, чтобы перечислять отдельные поля в списке через запятую, я просто объединял их. Есть ли у этого метода недостатки, на которые мне следует обратить внимание? Могу ли я рассчитывать на это, чтобы быть точным? И - есть ли лучший способ сделать это?

По сути, я группируюсь по месяцам, но «отдельный» счет должен основываться на днях. Например, если у меня есть идентификатор 31 3 января и 5 января, я хочу, чтобы он считался как 2 за январь, но если у меня есть идентификатор 31 дважды 3 января, я хочу, чтобы он считался только один раз.

Некоторые основные примеры данных и ожидаемый результат (пропуская field1 и field2 для этого):

*Date*              *ID*
1/3/12 00:00:09     22
1/3/12 00:13:00     22
1/4/12 12:00:00     22
1/7/12 15:00:45     27
1/15/12 15:00:00    22
2/6/12 00:00:09     50
2/8/12 00:13:00     44
2/8/12 12:00:00     45
2/22/12 15:00:45    33
2/22/12 15:00:00    33
2/22/12 15:00:00    44

*Year*  *Month* *Count*
2012    Jan     4
2012    Feb     5

Ответы на вопрос(2)

Ваш ответ на вопрос