普通行列转换

假设有张学生成绩表(t)如下

Name Subject Result
张三 语文
73
张三 数学
83
张三 物理
93
李四 语文
74
李四 数学
84
李四 物理
94

想变成
姓名 语文 数学 物理
张三
73
83
93
李四
74
84
94

create
table
#t
(
Name
varchar
(
10
) ,
Subject
varchar
(
10
) ,
Result
int
)

insert
into
#t(Name , Subject , Result)
values
(
'
张三
'
,
'
语文
'
,
'
73
'
)
insert
into
#t(Name , Subject , Result)
values
(
'
张三
'
,
'
数学
'
,
'
83
'
)
insert
into
#t(Name , Subject , Result)
values
(
'
张三
'
,
'
物理
'
,
'
93
'
)
insert
into
#t(Name , Subject , Result)
values
(
'
李四
'
,
'
语文
'
,
'
74
'
)
insert
into
#t(Name , Subject , Result)
values
(
'
李四
'
,
'
数学
'
,
'
83
'
)
insert
into
#t(Name , Subject , Result)
values
(
'
李四
'
,
'
物理
'
,
'
93
'
)

declare
@sql
varchar
(
8000
)
set
@sql
=
'
select Name as
'
+
'
姓名
'
select
@sql
=
@sql
+
'
, sum(case Subject when
'''
+
Subject
+
'''
then Result end) [
'
+
Subject
+
'
]
'
from
(
select
distinct
Subject
from
#t)
as
a
set
@sql
=
@sql
+
'
from #t group by name
'
exec
(
@sql
)

drop
table
#t

--
结果
姓名 数学 物理 语文
--
-------- ----------- ----------- -----------
李四
83
93
74
张三
83
93
73
--
--------------------------------------------------
如果上述两表互相换一下:即

姓名 语文 数学 物理
张三
73
83
93
李四
74
84
94

想变成
Name Subject Result
张三 语文
73
张三 数学
83
张三 物理
93
李四 语文
74
李四 数学
84
李四 物理
94

create
table
#t
(
姓名
varchar
(
10
) ,
语文
int
,
数学
int
,
物理
int
)

insert
into
#t(姓名 , 语文 , 数学 , 物理)
values
(
'
张三
'
,
73
,
83
,
93
)
insert
into
#t(姓名 , 语文 , 数学 , 物理)
values
(
'
李四
'
,
74
,
84
,
94
)

select
姓名
as
Name,
'
语文
'
as
Subject,语文
as
Result
from
#t
union
select
姓名
as
Name,
'
数学
'
as
Subject,数学
as
Result
from
#t
union
select
姓名
as
Name,
'
物理
'
as
Subject,物理
as
Result
from
#t
order
by
姓名
desc

drop
table
#t
--
结果
Name Subject Result
--
-------- ------- -----------
张三 数学
83
张三 物理
93
张三 语文
73
李四 数学
84
李四 物理
94
李四 语文
74

(所影响的行数为
6
行)

























































































