sql server 2008 如何把一列的值转换成一行显示

时间:2022-08-26 10:51:56
create table #tb(id int ,姓名 varchar(10) , 课程 varchar(10) , 分值 varchar(10) )
insert into #tb values(1,'张三' , '语文' , 'a')
insert into #tb values(2,'张三' , '数学' , 'b')
insert into #tb values(3,'张三' , '物理' , 'c')
insert into #tb values(4,'李四' , '语文' , 'd')
insert into #tb values(5,'李四' , '数学' , 'e')
insert into #tb values(6,'李四' , '物理' , 'f')

select * from #tb  
drop table #tb


我现在想实现的是:课程成为列名、然后分值对应到下面。怎么实现?
谢谢.... 我看着有转换成xml的、有用case的、有用函数PIVOT的啊 给我提供一个思路或者是存储过程呗。。

21 个解决方案

#1




 SELECT 姓名, MAX(CASE 课程 WHEN '语文' THEN 分值 ELSE 0 END) AS '语文', MAX(CASE 课程 WHEN '数学' THEN Score ELSE 0 END) AS '数学', MAX(CASE 课程 WHEN '物理' THEN Score ELSE 0 END) AS '物理' FROM [#tb] GROUP BY 姓名

#3


看清楚哦。。。呵呵。。没看清我怎么写的呢
引用 1 楼  的回复:
SQL code


 SELECT 姓名, MAX(CASE 课程 WHEN '语文' THEN 分值 ELSE 0 END) AS '语文', MAX(CASE 课程 WHEN '数学' THEN Score ELSE 0 END) AS '数学', MAX(CASE 课程 WHEN '物理' THEN Score ELSE 0 END) AS '物理' FROM [#tb] GROUP……

#5


哎...还有别的么?

#6


该回复于2012-10-23 09:06:33被版主删除

#7


SELECT 姓名,语文,数学,物理 FROM
(
select 姓名,课程,分值 from #tb  
) AS a
PIVOT
(
MAX(分值) FOR 课程 IN (语文,数学,物理)
) AS pvt

#8


姓名 语文 数学 物理
李四 d e f
张三 a b c

#9


引用 8 楼  的回复:
姓名 语文 数学 物理
李四 d e f
张三 a b c


max()里面能是文本么?

#10


引用 6 楼  的回复:
不为楼主的标题所吸引,也不是被贴子的内容所迷惑。 我不是来抢沙发的,也不是来打酱油的。 我不是来为楼主呐喊加油的,也不是对楼主进行围堵攻击的。 我只是为了积分默默奋斗。你是个美女,我不会嫉妒; 你是个怪兽,我绝不在意; 你是个帅哥,我毫不关心; 你是个畜男我也不会鄙视。你的情操再怎么高尚,我也不会赞美; 你的道德如何沦丧,我也不为所动。 在这个处处都要验证码的时代,不得不弄个会员来当当,之前也是每……



你真人讨厌

#11


引用 9 楼  的回复:
引用 8 楼  的回复:
姓名 语文 数学 物理
李四 d e f
张三 a b c


max()里面能是文本么?


MAX(列名)

#12


最好别用中文来定义表啊,列啊啥的

#13


引用 9 楼  的回复:
引用 8 楼 的回复:
姓名 语文 数学 物理
李四 d e f
张三 a b c


max()里面能是文本么?


我就要的是你的写的结果啊。可是你这样是不行的。max是聚合函数啊 我的值是文本啊。不能max的啊

#14


你的值再怎么是文本也在某一列里吧?
此处加聚合函数的意思是 
如果你有多条数据 例如

create table #tb(id int ,姓名 varchar(10) , 课程 varchar(10) , 分值 varchar(10) )
insert into #tb values(1,'张三' , '语文' , 'a')
insert into #tb values(2,'张三' , '数学' , 'b')
insert into #tb values(3,'张三' , '物理' , 'c')
insert into #tb values(4,'李四' , '语文' , 'd')
insert into #tb values(5,'李四' , '数学' , 'e')
insert into #tb values(6,'李四' , '物理' , 'f')
insert into #tb values(6,'李四' , '物理' , 'g')  -- 此处有2个李四的物理成绩,得用聚合函数合并,至于如何合并,取决于你,我一般都是用MAX来定义的,其实此处出现2个李四的物理成绩是错误的,应该在录入的时候就提醒录入的人。

#15


引用 14 楼 greenberet007 的回复:
你的值再怎么是文本也在某一列里吧?
此处加聚合函数的意思是 
如果你有多条数据 例如

create table #tb(id int ,姓名 varchar(10) , 课程 varchar(10) , 分值 varchar(10) )
insert into #tb values(1,'张三' , '语文' , 'a')
insert into #tb values(2,'张三' ……

 我没有写错吧?

#16


七楼正解,我试了,不错,正想学学这个。

#17


7楼正解,试试吧楼主

#18


引用 7 楼 greenberet007 的回复:
SELECT 姓名,语文,数学,物理 FROM
(
select 姓名,课程,分值 from #tb  
) AS a
PIVOT
(
MAX(分值) FOR 课程 IN (语文,数学,物理)
) AS pvt
 学习了,顶一下。。

#19


引用 17 楼 lsl110520 的回复:
7楼正解,试试吧楼主

 max里面是文本

#20


请大家看好啊。。哎 我那是 a b c d 不是数字

#21


sql有 PIVOT 关键字,你可查一查帮助.

#1




 SELECT 姓名, MAX(CASE 课程 WHEN '语文' THEN 分值 ELSE 0 END) AS '语文', MAX(CASE 课程 WHEN '数学' THEN Score ELSE 0 END) AS '数学', MAX(CASE 课程 WHEN '物理' THEN Score ELSE 0 END) AS '物理' FROM [#tb] GROUP BY 姓名

#2


#3


看清楚哦。。。呵呵。。没看清我怎么写的呢
引用 1 楼  的回复:
SQL code


 SELECT 姓名, MAX(CASE 课程 WHEN '语文' THEN 分值 ELSE 0 END) AS '语文', MAX(CASE 课程 WHEN '数学' THEN Score ELSE 0 END) AS '数学', MAX(CASE 课程 WHEN '物理' THEN Score ELSE 0 END) AS '物理' FROM [#tb] GROUP……

#4


#5


哎...还有别的么?

#6


该回复于2012-10-23 09:06:33被版主删除

#7


SELECT 姓名,语文,数学,物理 FROM
(
select 姓名,课程,分值 from #tb  
) AS a
PIVOT
(
MAX(分值) FOR 课程 IN (语文,数学,物理)
) AS pvt

#8


姓名 语文 数学 物理
李四 d e f
张三 a b c

#9


引用 8 楼  的回复:
姓名 语文 数学 物理
李四 d e f
张三 a b c


max()里面能是文本么?

#10


引用 6 楼  的回复:
不为楼主的标题所吸引,也不是被贴子的内容所迷惑。 我不是来抢沙发的,也不是来打酱油的。 我不是来为楼主呐喊加油的,也不是对楼主进行围堵攻击的。 我只是为了积分默默奋斗。你是个美女,我不会嫉妒; 你是个怪兽,我绝不在意; 你是个帅哥,我毫不关心; 你是个畜男我也不会鄙视。你的情操再怎么高尚,我也不会赞美; 你的道德如何沦丧,我也不为所动。 在这个处处都要验证码的时代,不得不弄个会员来当当,之前也是每……



你真人讨厌

#11


引用 9 楼  的回复:
引用 8 楼  的回复:
姓名 语文 数学 物理
李四 d e f
张三 a b c


max()里面能是文本么?


MAX(列名)

#12


最好别用中文来定义表啊,列啊啥的

#13


引用 9 楼  的回复:
引用 8 楼 的回复:
姓名 语文 数学 物理
李四 d e f
张三 a b c


max()里面能是文本么?


我就要的是你的写的结果啊。可是你这样是不行的。max是聚合函数啊 我的值是文本啊。不能max的啊

#14


你的值再怎么是文本也在某一列里吧?
此处加聚合函数的意思是 
如果你有多条数据 例如

create table #tb(id int ,姓名 varchar(10) , 课程 varchar(10) , 分值 varchar(10) )
insert into #tb values(1,'张三' , '语文' , 'a')
insert into #tb values(2,'张三' , '数学' , 'b')
insert into #tb values(3,'张三' , '物理' , 'c')
insert into #tb values(4,'李四' , '语文' , 'd')
insert into #tb values(5,'李四' , '数学' , 'e')
insert into #tb values(6,'李四' , '物理' , 'f')
insert into #tb values(6,'李四' , '物理' , 'g')  -- 此处有2个李四的物理成绩,得用聚合函数合并,至于如何合并,取决于你,我一般都是用MAX来定义的,其实此处出现2个李四的物理成绩是错误的,应该在录入的时候就提醒录入的人。

#15


引用 14 楼 greenberet007 的回复:
你的值再怎么是文本也在某一列里吧?
此处加聚合函数的意思是 
如果你有多条数据 例如

create table #tb(id int ,姓名 varchar(10) , 课程 varchar(10) , 分值 varchar(10) )
insert into #tb values(1,'张三' , '语文' , 'a')
insert into #tb values(2,'张三' ……

 我没有写错吧?

#16


七楼正解,我试了,不错,正想学学这个。

#17


7楼正解,试试吧楼主

#18


引用 7 楼 greenberet007 的回复:
SELECT 姓名,语文,数学,物理 FROM
(
select 姓名,课程,分值 from #tb  
) AS a
PIVOT
(
MAX(分值) FOR 课程 IN (语文,数学,物理)
) AS pvt
 学习了,顶一下。。

#19


引用 17 楼 lsl110520 的回复:
7楼正解,试试吧楼主

 max里面是文本

#20


请大家看好啊。。哎 我那是 a b c d 不是数字

#21


sql有 PIVOT 关键字,你可查一查帮助.