Как подсчитать несколько разных полей без повторения запроса?
У меня есть запрос с несколькими группировками, который возвращает количество в месяц. Что-то вроде этого:
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