--列转成行方式
--主要使用case when then (其实这里是创建新列,这里使用了三个case所能这里创建了三列:会计基础、计算机原理、数据结构与算法)
--详细解释:
--当表中每行记录开始时,
--查看列ctitle='会计基础'时,新的列内显示本行的score列内的值
--查看列ctitle='计算机原理'时,新的列内显示本行的score列内的值
--查看列ctitle='数据结构与算法'时,新的列内显示本行的score列内的值
select 学员姓名=s.sname,
case when ctitle='会计基础' then score end as 会计基础,
case when ctitle='计算机原理' then score end as 计算机原理,
case when ctitle='数据结构与算法' then score end as 数据结构与算法
from s
inner join sc on s.sid=sc.sid
inner join c on c.cid=sc.cid
--是面的查询已经基本实现了列变行的目的了,只是需要调整下,
--因为一个学员有一条记录就够了,现在有三条;并且每行都有空值,所以这里需要进行分组;
--可能大家注意到了,分组学员姓名就可以成为一行了,对于分值相加就可以了;
select 学员姓名=s.sname,
sum(case when ctitle='会计基础' then score end) as 会计基础,
sum(case when ctitle='计算机原理' then score end) as 计算机原理,
sum(case when ctitle='数据结构与算法' then score end )as 数据结构与算法
from s
inner join sc on s.sid=sc.sid
inner join c on c.cid=sc.cid
group by s.sname
--OK 成功!
--数据结构----------------------
--学员表
CREATE TABLE [dbo].[s](
[sid] [int] IDENTITY(1,1) NOT NULL, --主键递增+1
[sname] [nvarchar](50) NULL, --学员姓名
CONSTRAINT [PK_s] PRIMARY KEY CLUSTERED
(
[sid] 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
--添加
insert into [dbo].[s](sname)values('tom');
insert into [dbo].[s](sname)values('jery');
insert into [dbo].[s](sname)values('jim');
insert into [dbo].[s](sname)values('mack');
----------------------------------------------------------
--课程表
CREATE TABLE [dbo].[c](
[cid] [int] IDENTITY(1,1) NOT NULL, --主键递增+1
[ctitle] [nvarchar](50) NULL, --课程名称
CONSTRAINT [PK_c] PRIMARY KEY CLUSTERED
(
[cid] 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
insert into [dbo].[c](ctitle)values('会计基础');
insert into [dbo].[c](ctitle)values('计算机原理');
insert into [dbo].[c](ctitle)values('数据结构与算法');
-------------------------------------------------------------
--成绩表
CREATE TABLE [dbo].[sc](
[score] [int] NULL, --成绩分数
[cid] [int] NULL, --课程编号
[sid] [int] NULL --学员编号
) ON [PRIMARY]
GO
insert into [dbo].[sc](score,cid,[sid])values(23,1,1);
insert into [dbo].[sc](score,cid,[sid])values(87,2,1);
insert into [dbo].[sc](score,cid,[sid])values(69,3,1);
insert into [dbo].[sc](score,cid,[sid])values(93,1,2);
insert into [dbo].[sc](score,cid,[sid])values(27,2,2);
insert into [dbo].[sc](score,cid,[sid])values(83,3,2);
insert into [dbo].[sc](score,cid,[sid])values(60,1,3);
insert into [dbo].[sc](score,cid,[sid])values(29,2,3);
insert into [dbo].[sc](score,cid,[sid])values(73,3,3);
insert into [dbo].[sc](score,cid,[sid])values(74,1,4);
insert into [dbo].[sc](score,cid,[sid])values(62,2,4);
insert into [dbo].[sc](score,cid,[sid])values(83,3,4);