统计学生各科成绩,列转行
2017-07-10 12:20
204 查看
----查询学生各科成绩报表,一步一步分析
学生表
科目表
成绩表
----1.查询所有学生信息以及各科成绩集合
SELECT s.*,c.grade,r.couName FROM dbo.student AS s
LEFT JOIN dbo.score AS c ON c.stuId=s.stuId
LEFT JOIN dbo.course AS r ON c.couId=r.couId
----2.将各科成绩转换成一行
SELECT s.stuId,s.stuName,s.stuSex,s.age,
CASE r.couName WHEN '数学' THEN c.grade ELSE 0 END AS '数学',
CASE r.couName WHEN '语文' THEN c.grade ELSE 0 END AS '语文',
CASE r.couName WHEN '英语' THEN c.grade ELSE 0 END AS '英语',
CASE r.couName WHEN '历史' THEN c.grade ELSE 0 END AS '历史'
FROM dbo.student AS s
LEFT JOIN dbo.score AS c ON c.stuId=s.stuId
LEFT JOIN dbo.course AS r ON c.couId=r.couId
----3.统计成绩总数,并分组
SELECT s.stuId,s.stuName,
SUM(CASE r.couName WHEN '数学' THEN c.grade ELSE 0 END) AS '数学',
SUM(CASE r.couName WHEN '语文' THEN c.grade ELSE 0 END) AS '语文',
SUM(CASE r.couName WHEN '英语' THEN c.grade ELSE 0 END) AS '英语',
SUM(CASE r.couName WHEN '历史' THEN c.grade ELSE 0 END) AS '历史'
FROM dbo.student AS s
LEFT JOIN dbo.score AS c ON c.stuId=s.stuId
LEFT JOIN dbo.course AS r ON c.couId=r.couId
GROUP BY s.stuId,s.stuName
----4.或max()者也可以
SELECT s.stuId,s.stuName,
max(CASE r.couName WHEN '数学' THEN c.grade ELSE 0 END) AS '数学',
max(CASE r.couName WHEN '语文' THEN c.grade ELSE 0 END) AS '语文',
max(CASE r.couName WHEN '英语' THEN c.grade ELSE 0 END) AS '英语',
max(CASE r.couName WHEN '历史' THEN c.grade ELSE 0 END) AS '历史'
FROM dbo.student AS s
LEFT JOIN dbo.score AS c ON c.stuId=s.stuId
LEFT JOIN dbo.course AS r ON c.couId=r.couId
GROUP BY s.stuId,s.stuName
学生表
USE [Test] GO /****** Object: Table [dbo].[student] Script Date: 2017/7/10 12:17:00 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[student]( [stuId] [NVARCHAR](50) NOT NULL, [stuName] [VARCHAR](10) NOT NULL, [stuSex] [CHAR](2) NULL, [age] [INT] NULL, CONSTRAINT [PK__student__AEC9BF8FBC61E94F] PRIMARY KEY CLUSTERED ( [stuId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO ALTER TABLE [dbo].[student] WITH CHECK ADD CONSTRAINT [CK__student__age__117F9D94] CHECK (([age]>=(15) AND [age]<=(45))) GO ALTER TABLE [dbo].[student] CHECK CONSTRAINT [CK__student__age__117F9D94] GO ALTER TABLE [dbo].[student] WITH CHECK ADD CONSTRAINT [CK__student__age__1920BF5C] CHECK (([age]>=(15) AND [age]<=(45))) GO ALTER TABLE [dbo].[student] CHECK CONSTRAINT [CK__student__age__1920BF5C] GO ALTER TABLE [dbo].[student] WITH CHECK ADD CONSTRAINT [CK__student__stuSex__108B795B] CHECK (([stuSex]='男' OR [stuSex]='女')) GO ALTER TABLE [dbo].[student] CHECK CONSTRAINT [CK__student__stuSex__108B795B] GO ALTER TABLE [dbo].[student] WITH CHECK ADD CONSTRAINT [CK__student__stuSex__1A14E395] CHECK (([stuSex]='男' OR [stuSex]='女')) GO ALTER TABLE [dbo].[student] CHECK CONSTRAINT [CK__student__stuSex__1A14E395] GO
科目表
USE [Test] GO /****** Object: Table [dbo].[course] Script Date: 2017/7/10 12:17:54 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[course]( [couId] [NVARCHAR](50) NOT NULL, [couName] [VARCHAR](20) NOT NULL, CONSTRAINT [PK__course__965389F7BE4EE6DC] PRIMARY KEY CLUSTERED ( [couId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF
成绩表
USE [Test] GO /****** Object: Table [dbo].[score] Script Date: 2017/7/10 12:19:34 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[score]( [stuId] [NVARCHAR](50) NOT NULL, [couId] [NVARCHAR](50) NOT NULL, [grade] [INT] NULL, CONSTRAINT [PK__score__C7AC871022E01D82] PRIMARY KEY CLUSTERED ( [stuId] ASC, [couId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO ALTER TABLE [dbo].[score] WITH CHECK ADD CONSTRAINT [fk_couId] FOREIGN KEY([couId]) REFERENCES [dbo].[course] ([couId]) GO ALTER TABLE [dbo].[score] CHECK CONSTRAINT [fk_couId] GO ALTER TABLE [dbo].[score] WITH CHECK ADD CONSTRAINT [fk_stuId] FOREIGN KEY([stuId]) REFERENCES [dbo].[student] ([stuId]) GO ALTER TABLE [dbo].[score] CHECK CONSTRAINT [fk_stuId] GO ALTER TABLE [dbo].[score] WITH CHECK ADD CONSTRAINT [CK__score__grade__164452B1] CHECK (([grade]>=(0) AND [grade]<=(100))) GO ALTER TABLE [dbo].[score] CHECK CONSTRAINT [CK__score__grade__164452B1] GO
----1.查询所有学生信息以及各科成绩集合
SELECT s.*,c.grade,r.couName FROM dbo.student AS s
LEFT JOIN dbo.score AS c ON c.stuId=s.stuId
LEFT JOIN dbo.course AS r ON c.couId=r.couId
----2.将各科成绩转换成一行
SELECT s.stuId,s.stuName,s.stuSex,s.age,
CASE r.couName WHEN '数学' THEN c.grade ELSE 0 END AS '数学',
CASE r.couName WHEN '语文' THEN c.grade ELSE 0 END AS '语文',
CASE r.couName WHEN '英语' THEN c.grade ELSE 0 END AS '英语',
CASE r.couName WHEN '历史' THEN c.grade ELSE 0 END AS '历史'
FROM dbo.student AS s
LEFT JOIN dbo.score AS c ON c.stuId=s.stuId
LEFT JOIN dbo.course AS r ON c.couId=r.couId
----3.统计成绩总数,并分组
SELECT s.stuId,s.stuName,
SUM(CASE r.couName WHEN '数学' THEN c.grade ELSE 0 END) AS '数学',
SUM(CASE r.couName WHEN '语文' THEN c.grade ELSE 0 END) AS '语文',
SUM(CASE r.couName WHEN '英语' THEN c.grade ELSE 0 END) AS '英语',
SUM(CASE r.couName WHEN '历史' THEN c.grade ELSE 0 END) AS '历史'
FROM dbo.student AS s
LEFT JOIN dbo.score AS c ON c.stuId=s.stuId
LEFT JOIN dbo.course AS r ON c.couId=r.couId
GROUP BY s.stuId,s.stuName
----4.或max()者也可以
SELECT s.stuId,s.stuName,
max(CASE r.couName WHEN '数学' THEN c.grade ELSE 0 END) AS '数学',
max(CASE r.couName WHEN '语文' THEN c.grade ELSE 0 END) AS '语文',
max(CASE r.couName WHEN '英语' THEN c.grade ELSE 0 END) AS '英语',
max(CASE r.couName WHEN '历史' THEN c.grade ELSE 0 END) AS '历史'
FROM dbo.student AS s
LEFT JOIN dbo.score AS c ON c.stuId=s.stuId
LEFT JOIN dbo.course AS r ON c.couId=r.couId
GROUP BY s.stuId,s.stuName
相关文章推荐
- Sql Server 行转列学习 根据学生表、课程表、学生成绩表统计每个学生的各科成绩和他的总成绩、平均成绩
- 写sql语句统计各个学生各科成绩(case when用法)
- HDU 1235 统计同成绩学生人数
- 简单的 学生 各科 成绩 展示 sql
- HDOJ1235 ( 统计同成绩学生人数 ) 【水题】
- 题目10 统计同成绩学生人数
- 多位学生成绩的统计
- 九度1018 统计同成绩学生人数
- 分支-17. 统计学生成绩(15)
- Hadoop MapReduce编程 API入门系列之统计学生成绩版本2(十八)
- 学生成绩等级统计
- 九度OnlineJudge之1018:统计同成绩学生人数
- 从键盘上输入学生成绩,统计并输出最高成绩和最低成绩,当输入负数时结束输入。
- 3-5 学生成绩统计
- 【HDU-1235】 统计同成绩学生人数
- PAT-B 1038. 统计同成绩学生
- 1038. 统计同成绩学生(20)
- PAT乙级1038 统计同成绩学生
- HDU1235 统计同成绩学生人数
- MySQL实现学生选课系统的成绩统计