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

在线等,求一个简单的行列转行写法
数据库是SQL 2005
目前的表结构为 name value字段,name为主键
里面的内容为
name        value
-----------------
张三         3
李四         2
王五         1


现在需要得到这样的结果
张三    李四   王五
 3       2     1

里面的数据量不固顶,请问如何写出?谢谢各位大大指教.
行列转换

------解决方案--------------------
CREATE TABLE  test1([name] VARCHAR(10) NOT NULL,[value] INT NOT NULL)
INSERT INTO test1
VALUES ('张三',3),('李四',2),('王五',1)

--静态
select 
    张三=max(case when [name]='张三' then [value] else 0 END),
    李四=max(case when [name]='李四' then [value] else 0 END),
    王五=max(case when [name]='王五' then [value] else 0 END)
from test1 

--动态: 
declare @s nvarchar(4000)
set @s=''
Select  @s=@s+','+quotename([name])+'=max(case when [name]='+quotename([name],'''')+' then [value] else 0 end)'
from test1  group by[name]  
SET @s=STUFF(@s,1,1,'')
PRINT @s

exec('select '+@s+' from test1 ')

请参考:
http://bbs.csdn.net/topics/240002706
------解决方案--------------------
SELECT * FROM test1 
PIVOT (MAX([value]) FOR [name] in(张三,李四,王五))b
------解决方案--------------------

create table sa
(name varchar(10), value int)

insert into sa
 select '张三', 3 union all
 select '李四', 2 union all
 select '王五', 1


declare @tsql varchar(6000)

select @tsql=isnull(@tsql,'')+'['+name+'],'
 from sa
 
select @tsql='select '+left(@tsql,len(@tsql)-1)
+' from sa a '
+' pivot(max(value) for name in('+left(@tsql,len(@tsql)-1)+')) p ' 

exec(@tsql)

/*
张三          李四          王五
----------- ----------- -----------
3           2           1

(1 row(s) affected)
*/