SQL server 行转换成列,case when then else end

--列转成行方式
--
主要使用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 endas 会计基础,
sum(case when ctitle='计算机原理' then score endas 计算机原理,
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,1NOT NULL--主键递增+1
    [sname] [nvarchar](50NULL,        --学员姓名
 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  = ONON [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,1NOT NULL--主键递增+1
    [ctitle] [nvarchar](50NULL,       --课程名称
 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  = ONON [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);
有不妥的地方,请各位高手指点,非常感谢!
posted @ 2011-06-13 16:00  程序员老李  阅读(1291)  评论(0编辑  收藏  举报