1、题目
已知表信息如下:
Department(depID, depName) 系编号,系名
Student(stuID, name, depID) 学生编号,姓名,系编号
Score(stuID, category, score) 学生编码,科目,成绩
找出每一个系的最高分,并且按系编号,学生编号升序排列,要求顺序输出以下信息:
系编号,系名,学生编号,姓名,总分
2、准备工作
/****** Object: Table [dbo].[Department] ******/
CREATE TABLE Department(
depID int NOT NULL,
depName varchar(50) NOT NULL,
)
GO
INSERT [dbo].[Department] ([depID], [depName]) VALUES (1, N'计算机')
INSERT [dbo].[Department] ([depID], [depName]) VALUES (2, N'生物')
INSERT [dbo].[Department] ([depID], [depName]) VALUES (3, N'数学')
/****** Object: Table [dbo].[Student] ******/
CREATE TABLE Student(
stuID int NOT NULL,
stuName varchar(50) NOT NULL,
deptID int NOT NULL
)
GO
INSERT [dbo].[Student] ([stuID], [stuName], [deptID]) VALUES (1, N'计算机张三', 1)
INSERT [dbo].[Student] ([stuID], [stuName], [deptID]) VALUES (2, N'计算机李四', 1)
INSERT [dbo].[Student] ([stuID], [stuName], [deptID]) VALUES (3, N'计算机王五', 1)
INSERT [dbo].[Student] ([stuID], [stuName], [deptID]) VALUES (4, N'生物amy', 2)
INSERT [dbo].[Student] ([stuID], [stuName], [deptID]) VALUES (5, N'生物kity', 2)
INSERT [dbo].[Student] ([stuID], [stuName], [deptID]) VALUES (6, N'生物lucky', 2)
INSERT [dbo].[Student] ([stuID], [stuName], [deptID]) VALUES (7, N'数学_yiming', 3)
INSERT [dbo].[Student] ([stuID], [stuName], [deptID]) VALUES (8, N'数学_haoxue', 3)
INSERT [dbo].[Student] ([stuID], [stuName], [deptID]) VALUES (9, N'数学_wuyong', 3)
/****** Object: Table [dbo].[Score] ******/
CREATE TABLE Score(
stuID int NOT NULL,
category varchar(50) NOT NULL,
score int NOT NULL
)
GO
INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (1, N'英语', 80)
INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (2, N'数学', 80)
INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (1, N'数学', 70)
INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (2, N'英语', 89)
INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (3, N'英语', 81)
INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (3, N'数学', 71)
INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (4, N'数学', 91)
INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (4, N'英语', 61)
INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (5, N'英语', 91)
INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (6, N'英语', 89)
INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (7, N'英语', 77)
INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (8, N'英语', 97)
INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (9, N'英语', 57)
INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (5, N'数学', 87)
INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (6, N'数学', 89)
INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (7, N'数学', 80)
INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (8, N'数学', 81)
INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (9, N'数学', 84)
3、sql1
SELECT t6.*
FROM (
SELECT t3.depID, t3.depName, t2.stuID, t2.stuName, t1.scoreSum
FROM Department t3
INNER JOIN Student t2 ON t2.deptID = t3.depID
INNER JOIN (
SELECT stuID, SUM(score) AS scoreSum
FROM Score
GROUP BY stuID
) t1
ON t2.stuID = t1.stuID
) t6
INNER JOIN (
SELECT deptID, MAX(scoreSum) AS scoreSum
FROM (
SELECT t2.deptID, t1.scoreSum
FROM Student t2
INNER JOIN (
SELECT stuID, SUM(score) AS scoreSum
FROM Score
GROUP BY stuID
) t1
ON t2.stuID = t1.stuID
) t4
GROUP BY deptID
) t5
ON t6.depID = t5.deptID
AND t6.scoreSum = t5.scoreSum
ORDER BY depID, stuID
sql2
扫描二维码关注公众号,回复:
4053556 查看本文章
SELECT Department.depID, Department.depName, Student.stuID, stuName, Dscore.scores
FROM Department
LEFT JOIN Student ON department.depID = student.deptID
LEFT JOIN (
SELECT Score.stuId, SUM(Score) AS scores
FROM Score
GROUP BY stuID
) Dscore
ON Student.stuID = dScore.stuID
WHERE EXISTS (
SELECT *
FROM (
SELECT deptID, MAX(scores) AS topScores
FROM Student
LEFT JOIN (
SELECT stuID, SUM(score) AS scores
FROM Score
GROUP BY stuID
) newScore
ON Student.stuID = newScore.stuID
GROUP BY deptID
) depScore
WHERE Department.depID = depScore.deptID
AND Dscore.scores = depScore.topScores
)
ORDER BY Department.depID, Student.stuID;
sql3
WITH cte1 AS (
SELECT DISTINCT D.depID, D.depName, S.stuID, S.stuName
, SUM(Sc.score) OVER (PARTITION BY D.depID, S.stuID ) AS sumScore
FROM Department D
LEFT JOIN Student S ON D.depID = S.deptID
LEFT JOIN Score Sc ON Sc.stuID = S.stuID
),
cte2 AS (
SELECT DISTINCT depID, stuID, MAX(sumScore) OVER (PARTITION BY depID ) AS maxScore
FROM cte1
)
SELECT c1.depID, c1.depName, c1.stuID, c1.stuName, c1.sumScore
FROM cte2 c2
INNER JOIN cte1 c1
ON (c1.depID = c2.depID
AND c1.stuID = c2.stuID
AND c1.sumScore = c2.maxScore)
ORDER BY depID, stuID
sql4
WITH a AS (
SELECT Department.depID, Department.depName, Student.stuID, stuName, Dscore.scores
FROM Department
LEFT JOIN Student ON department.depID = student.deptID
LEFT JOIN (
SELECT Score.stuId, SUM(Score) AS scores
FROM Score
GROUP BY stuID
) Dscore
ON Student.stuID = dScore.stuID
)
SELECT depID, depName, stuID, stuName, scores
FROM a
WHERE a.scores = (
SELECT MAX(scores)
FROM a b
WHERE a.depid = b.depid
)
ORDER BY depID, stuID
sql5
SELECT bb.deptID, cc.depName, bb.stuID, bb.stuName, bb.TotalScore
FROM (
SELECT *, RANK() OVER (PARTITION BY deptID ORDER BY TotalScore DESC) AS pos
FROM (
SELECT SUM(b.score) AS TotalScore, a.stuID, a.stuName, a.deptID
FROM Student a
JOIN Score b ON a.StuID = b.StuID
GROUP BY a.stuID, a.stuName, a.deptID
) aa
) bb
JOIN dbo.Department cc ON bb.deptID = cc.depID
WHERE pos = '1'
ORDER BY bb.deptID, bb.stuID