日期:2014-05-17  浏览次数:20441 次

请教SqlServer关于行专列问题
姓名        年龄     性别

--------------------------------------------

张一         23        女

张二         28        男

张三         27        男

张四         26        女

想变成(得到如下结果):

字段名称    张一    张二    张三    张四

-----------------------------------------------------

年龄          23       28        27        26

性别          女        男        男        女


------最佳解决方案--------------------
--> 测试数据:[TB]
if object_id('[TB]') is not null drop table [TB]
GO
create table [TB]([name] varchar(4),[age] int,[sex] varchar(2))
insert [TB]
select '张一',23,'女' union all
select '张二',28,'男' union all
select '张三',27,'男' union all
select '张四',26,'女'

DECLARE @sql VARCHAR(4000)
SET @sql='SELECT 字段名称=''年龄'''
SELECT @sql=@sql+','+QUOTENAME([NAME])+'=max(CASE WHEN [name]='''+[Name]+''' then rtrim(age) ELSE '''' end)'+CHAR(10) FROM TB t
SET @sql=@sql+' from [TB] union all select ''性别'''
SELECT @sql=@sql+','+QUOTENAME(RTRIM([NAME]))+'=max(CASE WHEN [name]='''+RTRIM([NAME])+''' then rtrim([sex]) ELSE '''' end)'+CHAR(10) FROM TB t
SET @sql=@sql+' from [TB]'
EXEC(@sql)

/*
字段名称 张一           张二           张三           张四
---- ------------ ------------ ------------ ------------
年龄   23           28           27           26
性别   女            男            男            女

(2 行受影响)


*/

drop table [TB]

------其他解决方案--------------------

if(object_id('a')is not null)drop table a
go
create table a
(
Name varchar(4),
age int,
sex varchar(2)
)
go
insert  into a
select '张一',23,'女' union all
select '张二',28,'男' union all
select '张三',27,'男' union all
select '张四',26,'女'

--动态
declare @sql varchar(max)
declare @sql1 varchar(max)