2015-08-24 5 views
0

В моем 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 

но этот запрос возвращает мне слишком много неправильных данных. Пожалуйста, скажи мне, где я ошибаюсь.

ответ

0

Почему не сделать это прямо ..

select 
    username 
    ,convert(date,actionDate) as actionDate 
    ,count(*) as countRow 
from actionTable 
where action = 'add' 
group by username 
     ,convert(date,actionDate) 
+0

Прохладный! Работал для меня! Так просто ... спасибо большое! –

+0

еще один вопрос по этому запросу. actionTable имеет намного больше cols - 28. Только некоторые из них имеют индексы. Не будет считаться (*) очень медленно? можно ли считать не всех колосов? –

+0

Нет проблем. Count (*) будет просто подсчитывать строки. Вы можете использовать count (1) или count (oneColumn) или count (*). Он будет делать то же самое. –

0

Попробуйте

select convert(date,actionDate) actionDate, username, 
count(*) coutntRow from actionTable 
where action = 'add' 
group by convert(date,actionDate), userName 
0
SELECT S.username, Convert(date, S.actionDate), count(S.id) as countRow,S.action 
From dbo.actionTable S WHERE S.action = 'add' 
GROUP BY Convert(date, S.actionDate),S.action,S.username 
0
I recommend you the normalization of your database. 

If I were you I do this: 
++++++++++++++++++++++++ 
Table name: **userTable** 
------------------------------------ 
id | username 
------------------------------------ 
1 | bob   
2 | sandra 
3 | peter 
++++++++++++++++++++++++ 
Table name: **actionTable** 
------------------------------------ 
id | action 
------------------------------------ 
1 | add 
2 | update 
3 | delete 
++++++++++++++++++++++++ 
Table name: **actionUser** 
------------------------------------ 
ID | user_id | action_id | actionDate 
------------------------------------ 
| 1 | 1  | 1  | 2015-08-15 11:20:12 
| 2 | 2  | 2  | 2015-08-15 11:21:52 
| 3 | 1  | 1  | 2015-08-15 11:25:32 

Это лучшая архитектура для этой проблемы.

И запрос должен быть таким:

SELECT COUNT(user_id) 
FROM dbo.actionUser 
WHERE user_id = % 

, где% является идентификатором вашего пользователя.

+0

Да, я согласен с тобой. но это не моя база данных. У меня нет доступа к управлению им. Мне просто нужно использовать эту таблицу, и это намного сложнее. но спасибо за совет –

+1

Я знаю, что вы имеете в виду. На улице много бандлеров. – norbertoonline

Смежные вопросы