2014-09-30 200 views
1
SELECT 
    *, COUNT(examID) AS ExamCount 
FROM 
    ExamSession 
GROUP BY 
    [examID], [userID], [sessionID] 

這給了我一個結果集,但ExamCount有一個「1」,即使考試顯示在1個多行的每一行中...我想獲取examID在結果集中出現的次數。數和組通過獲得總計

所以結果集是這樣的:

examID | userID | sessionID | ExamCount 
--------------------------------------------------------- 
1111 | xxxxxx | xxxxxx | 1 
1111 | xxxxxx | xxxxxx | 1 
1111 | xxxxxx | xxxxxx | 1 
2222 | xxxxxx | xxxxxx | 1 
2222 | xxxxxx | xxxxxx | 1 
3333 | xxxxxx | xxxxxx | 1 
3333 | xxxxxx | xxxxxx | 1 
3333 | xxxxxx | xxxxxx | 1 
3333 | xxxxxx | xxxxxx | 1 

我怎樣才能獲得的倍examID出現次數的計數?

謝謝!

回答

7

代碼:

COUNT(examID) OVER(PARTITION BY examID) AS ExamCount 
+0

你能解釋一下嗎?謝謝 – Horaciux 2014-09-30 17:10:53

+1

@Horaciux [這個鏈接](http://msdn.microsoft.com/en-us/library/ms189461.aspx)解釋SQL Server中的'OVER'子句 – Lamak 2014-09-30 19:14:32

0
SELECT examId, COUNT(examID) AS ExamCount 
    FROM ExamSession 
    GROUP BY [examID] 

編輯: 如果你需要的所有列

select t1.*, t2.ExamCount 
from(
    SELECT *  
    FROM 
     ExamSession 
    GROUP BY 
     [examID], [userID], [sessionID]) t1 
inner join (
    SELECT examId, COUNT(examID) AS ExamCount 
     FROM ExamSession 
     GROUP BY [examID]) t2 
on t1.examID=t2.examID 
+1

這隻適用於沒有他指定的其他列他想要的輸出。 – 2014-09-30 16:31:43

+0

@ jbarker2160添加了所有列,我誤解了請求。 – Horaciux 2014-09-30 17:03:27

+0

NP。越多答案越好! – 2014-09-30 17:08:13

0

編輯:

select A.examid, B.UserId, b.SessionID, A.ExamCount from 
(SELECT examId, COUNT(examID) AS ExamCount 
    FROM ExamSession 
    GROUP BY [examID]) A 
JOIN (select [examID] ,[userID] ,[sessionID] from ExamSession) B 
on a.examid = b.examid 
+0

'C.SessionID'? – Horaciux 2014-09-30 17:04:48

+0

糟糕,我的壞。它應該是B.SessionID。編輯我的答案。 – SouravA 2014-09-30 17:06:23

1

爲了詳細說明jbarker答一點WER

if object_id(N'dbo.groupTry',N'U') is not null 
    drop table dbo.groupTry 
create table dbo.groupTry 
(
    examID int, 
    userID int, 
    sessionID int, 
    ExamCount int 
) 

insert into dbo.groupTry values 
(1111, 1234, 4321, 1), 
(1111, 9876, 6789, 1), 
(1111, 8765, 5678, 1), 
(2222, 7654, 4567, 1), 
(2222, 6543, 3456, 1), 
(3333, 5432, 2345, 1), 
(3333, 1987, 1789, 1), 
(3333, 1876, 1678, 1), 
(3333, 1765, 1567, 1) 

select 
    count(g.examID) over(partition by examID) as ExamCount, 
    g.examID, 
    g.userID, 
    g.sessionID, 
    g.ExamCount 
from dbo.groupTry g 
group by examID, 
    userID, 
    sessionID, 
    ExamCount 

在我自己簡單的話,經過短短的意思是:不看的所有列時,你算,只是看和計數examID的唯一行(因爲我們是由examID分區)。

+0

感謝您的澄清。 – Horaciux 2014-10-01 00:55:17

+0

@Horaciux沒問題。希望它有幫助。 – 2014-10-01 16:09:39