В моем SQL Server 2008 у меня есть таблица, в которой хранится datetime
действий каждого пользователя. Это выглядит примерно так:SQL Server: группировка подсчета по пользователю и дате
id | username | action | actionDate
------------------------------------
1 | bob | add | 2015-08-15 11:20:12
2 | bob | add | 2015-08-15 11:21:52
3 | sandra | add | 2015-08-15 11:25:32
4 | sandra | add | 2015-08-15 11:26:32
5 | bob | add | 2015-08-15 11:31:52
6 | sandra | add | 2015-08-16 13:46:32
7 | sandra | add | 2015-08-16 13:26:32
8 | bob | add | 2015-08-16 13:31:52
9 | sandra | add | 2015-08-16 13:46:32
Эта таблица довольно большая и хранит данные в течение многих-многих дней. Поэтому мне нужно узнать, сколько раз каждый пользователь делал действие «добавлять» на каждый день. например:
actionDate | username | countRow
2015-08-15 | bob | 3
2015-08-15 | sandra | 2
2015-08-16 | bob | 2
2015-08-16 | sandra | 3
Я пробовал много разных запросов, но я все еще не могу получить его. Самый близкий запрос, который я думаю, выглядит так:
SELECT S.username, S.actionDate, C.countRow
From dbo.actionTable S
INNER JOIN(SELECT Convert(date, actionDate),count(username) as countRow
FROM dbo.actionTable
WHERE action = 'add'
GROUP BY Convert(date, actionDate)) C ON S.actionDate = C.actionDate
но этот запрос возвращает мне слишком много неправильных данных. Пожалуйста, скажи мне, где я ошибаюсь.
Прохладный! Работал для меня! Так просто ... спасибо большое! –
еще один вопрос по этому запросу. actionTable имеет намного больше cols - 28. Только некоторые из них имеют индексы. Не будет считаться (*) очень медленно? можно ли считать не всех колосов? –
Нет проблем. Count (*) будет просто подсчитывать строки. Вы можете использовать count (1) или count (oneColumn) или count (*). Он будет делать то же самое. –