Может быть, что-то вроде этого:
Данные испытаний
DECLARE @tbl TABLE(CourseID INT,StudentName VARCHAR(100),PaperCode INT)
INSERT INTO @tbl
VALUES
(101,'David',10001),
(101,'David',20000),
(101,'George',10000),
(102,'Peter',10000),
(102,'Peter',20000),
(102,'David',20000)
Запрос
как сказал Микаэль Эрикссон, это будет работать в SQL Server 2005/2008. Но это не будет работать в SQL Server 2012.
;WITH CTE
AS
(
SELECT
ROW_NUMBER() OVER(PARTITION BY tbl.CourseID ORDER BY tbl.CourseID) AS RowNumber,
COUNT(PaperCode) OVER(PARTITION BY tbl.CourseID, tbl.[StudentName]) AS NumberofRegistration,
CourseID,
StudentName,
PaperCode
FROM
@tbl AS tbl
)
SELECT
CTE.CourseID,
CTE.StudentName,
CTE.NumberofRegistration
FROM
CTE
WHERE
CTE.RowNumber=1
Но это будет работать в SQL Server 2012:
;WITH CTE
AS
(
SELECT
COUNT(CourseID) OVER(PARTITION BY tbl.CourseID,tbl.StudentName) AS NumberofRegistration,
tbl.CourseID,
tbl.StudentName,
tbl.PaperCode
FROM
@tbl AS tbl
)
, CTE2
AS
(
SELECT
ROW_NUMBER() OVER(PARTITION BY CTE.CourseID ORDER BY CTE.NumberofRegistration DESC) AS RowNumber,
CTE.NumberofRegistration,
CTE.CourseID,
CTE.StudentName,
CTE.PaperCode
FROM
CTE
)
SELECT
CTE2.CourseID,
CTE2.StudentName,
CTE2.NumberofRegistration
FROM
CTE2
WHERE
CTE2.RowNumber=1
Результат
CourseID| StudentName | NumberofRegistration
101 David 2
102 Peter 2