Tsql Transact-SQL查找每个组中的最大注册数
大家早上好 我有一个表结构(我使用的是SQL SERVER 2000) CourseID StudentName术语PaperID 我想列出课程ID、学生姓名、每门课程的最大注册人数 我尝试了以下查询Tsql Transact-SQL查找每个组中的最大注册数,tsql,sql-server-2000,Tsql,Sql Server 2000,大家早上好 我有一个表结构(我使用的是SQL SERVER 2000) CourseID StudentName术语PaperID 我想列出课程ID、学生姓名、每门课程的最大注册人数 我尝试了以下查询 select CourseId, StudentName, max(x.numberofregistration) as max_registration from ( select CourseID, StudentName,
select
CourseId,
StudentName,
max(x.numberofregistration) as max_registration
from
(
select
CourseID,
StudentName,
count(CourseID) as numberofregistration
from
dbo.Students
group by CourseId,StudentName
)x
group by CourseId,StudentName
但它没有给出预期的结果
预期的结果是
我有一个桌子结构
CourseID学生姓名最大注册
如何达到预期的效果?提前谢谢。这里有一个非常非常丑陋的方式。我想我宁愿付升级费,也不愿写太多这样的东西。希望其他人能想出更干净的东西
CREATE TABLE #x(CourseID INT, StudentName VARCHAR(32), TermPaperID INT);
INSERT #x SELECT 101,'Jon ',1;
INSERT #x SELECT 101,'Jon ',2;
INSERT #x SELECT 101,'Jon ',3;
INSERT #x SELECT 101,'David ',1;
INSERT #x SELECT 101,'David ',2;
INSERT #x SELECT 102,'David ',5;
INSERT #x SELECT 102,'David ',6;
INSERT #x SELECT 102,'George',5;
SELECT b.CourseID, b.StudentName, max_registration = COUNT(*)
FROM #x AS b
INNER JOIN (
SELECT CourseID, c = MAX(c)
FROM
(
SELECT CourseID, StudentName, c = COUNT(CourseID)
FROM #x GROUP BY CourseID, StudentName
) AS x GROUP BY CourseID
) AS s
ON b.CourseID = s.CourseID
GROUP BY b.CourseID, b.StudentName
HAVING COUNT(*) = MAX(s.c)
ORDER BY b.CourseID;
您的CTE“x”似乎按与您正在计数的CTE相同的值进行分组。仅仅计算一个不同的字段(即学期论文id)就可以得到预期的结果
也就是说,在你想要的结果样本中,我不清楚为什么这些结果是来自样本数据的预期结果。如果我误解了这个问题,我很乐意再试一次!:-) SQL Server 2000?我为你感到难过,但为什么呢?如果有另一排:“102,乔治,5”你认为这会对结果产生什么影响?非常感谢你花时间指导我。我确实同意使用row_number()和Partition我们可以很容易地解决这个问题,但我正在处理客户端项目,其中他们仍然使用SQL Server 2000。
101 Jon 3
102 David 2
CREATE TABLE #x(CourseID INT, StudentName VARCHAR(32), TermPaperID INT);
INSERT #x SELECT 101,'Jon ',1;
INSERT #x SELECT 101,'Jon ',2;
INSERT #x SELECT 101,'Jon ',3;
INSERT #x SELECT 101,'David ',1;
INSERT #x SELECT 101,'David ',2;
INSERT #x SELECT 102,'David ',5;
INSERT #x SELECT 102,'David ',6;
INSERT #x SELECT 102,'George',5;
SELECT b.CourseID, b.StudentName, max_registration = COUNT(*)
FROM #x AS b
INNER JOIN (
SELECT CourseID, c = MAX(c)
FROM
(
SELECT CourseID, StudentName, c = COUNT(CourseID)
FROM #x GROUP BY CourseID, StudentName
) AS x GROUP BY CourseID
) AS s
ON b.CourseID = s.CourseID
GROUP BY b.CourseID, b.StudentName
HAVING COUNT(*) = MAX(s.c)
ORDER BY b.CourseID;