SQL篇之--系学生成绩

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

猜你喜欢

转载自blog.csdn.net/orc000/article/details/82529711
今日推荐