数据库表中这样把横向记录纵向显示
|
|
|
普通行列转换
问题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
想变成(得到如下结果):
姓名 语文 数学 物理
---- ---- ---- ----
李四 74
84 94
张三 74
83 93
-------------------
*/
create tabletb(姓名
varchar(10) ,
课程 varchar(10) ,
分数 int)
insert into
tb values('张三'
, '语文'
, 74)
insert intotb
values('张三'
, '数学'
, 83)
insert intotb
values('张三'
, '物理'
, 93)
insert intotb
values('李四'
, '语文'
, 74)
insert intotb
values('李四'
, '数学'
, 84)
insert intotb
values('李四'
, '物理'
, 94)
go
--SQL SERVER 2000 静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)
select 姓名
as 姓名 ,
max(case
课程 when
'语文' then分数
else 0
end) 语文,
max(case
课程 when
'数学' then分数
else 0
end) 数学,
max(case
课程 when
'物理' then分数
else 0
end) 物理
from tb
group by姓名
--SQL SERVER 2000 动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)
declare @sql
varchar(8000)
set @sql=
'select 姓名
'
select @sql
= @sql
+ ' , max(case
课程 when '''
+ 课程 +
''' then 分数 else 0 end) ['
+ 课程+
']'
from (select
distinct 课程
from tb) asa
set @sql=
@sql +
' from tb group by 姓名'
exec(@sql)
--SQL SERVER 2005 静态SQL。
select *
from(select
* from
tb) a pivot (max(分数)
for课程
in (语文,数学,物理)) b
--SQL SERVER 2005 动态SQL。
declare @sql
varchar(8000)
select @sql=
isnull(@sql
+ ','
, '')
+ 课程 from
tb groupby
课程
exec ('select * from (select *from tb) a pivot (max(分数)for
课程 in (' + @sql
+ ')) b')
本文介绍了如何将数据库表中的横向记录转换为纵向显示的方法,包括SQL Server 2000及更高版本的静态和动态SQL实现。适用于不同场景的需求。
2041

被折叠的 条评论
为什么被折叠?



