Sql 计数并分组以获得总数

Sql 计数并分组以获得总数,sql,sql-server,tsql,Sql,Sql Server,Tsql,这给了我一个结果集,但是ExamCount在每行中都有一个“1”,即使一个考试显示在多行中。。。我试图获取examID在结果集中出现的次数 因此,结果集如下所示: SELECT *, COUNT(examID) AS ExamCount FROM ExamSession GROUP BY [examID], [userID], [sessionID] 如何获得examID出现次数的计数 谢谢 代码: 代码: 编辑: 如果需要所有列 SELECT examId, C

这给了我一个结果集,但是
ExamCount
在每行中都有一个“1”,即使一个考试显示在多行中。。。我试图获取
examID
在结果集中出现的次数

因此,结果集如下所示:

SELECT 
   *, COUNT(examID) AS ExamCount 
FROM 
   ExamSession
GROUP BY
   [examID], [userID], [sessionID]
如何获得
examID
出现次数的计数

谢谢

代码: 代码: 编辑: 如果需要所有列

   SELECT examId, COUNT(examID) AS ExamCount 
   FROM ExamSession
   GROUP BY [examID]
编辑: 如果需要所有列

   SELECT examId, COUNT(examID) AS ExamCount 
   FROM ExamSession
   GROUP BY [examID]
编辑:

编辑:


详细说明一下jbarker的答案

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

用我自己的简单话说,over just的意思是:在计算时不要看所有的列,只要看一看并计算examID的唯一行(因为我们是按examID分区的)。

来详细说明一下jbarker的答案

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

用我自己的简单话说,over just的意思是:计数时不要查看所有列,只需查看并计数examID的唯一行(因为我们是按examID进行分区的)。

这只适用于没有他在输出中指定的他想要的其他列的情况。NP。回答越多,越开心!这只在没有他想要的输出中指定的其他列的情况下起作用。回答越多,越开心!哎呀,我的错。应该是B.SessionID。编辑了我的答案。哦,我的错。应该是B.SessionID。编辑了我的答案。你能解释一下吗?Thanks@Horaciux解释SQL Server中的
OVER
子句。您能解释一下吗?Thanks@Horaciux解释SQL Server中的
OVER
子句感谢您的澄清。@Horaciux没问题。希望有帮助。谢谢你的澄清。@Horaciux没问题。希望有帮助。
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
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