2015-08-24 55 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.只有一些人有索引。不會計數(*)會很慢嗎?有沒有可能不是所有的cols? –

+0

沒有問題。計數(*)只會計算行數。您可以使用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 = % 

其中%是用戶的ID。

+0

是的,我同意你的看法。但它不是我的數據庫。我無法管理它。我只需要使用這張表,這更復雜。但感謝您的建議 –

+1

我知道你的意思。街上有很多笨蛋。 – norbertoonline