数据库是SQL 2005
目前的表结构为 name value字段,name为主键
里面的内容为
name value
-----------------
张三 3
李四 2
王五 1
现在需要得到这样的结果
张三 李四 王五
3 2 1里面的数据量不固顶,请问如何写出?谢谢各位大大指教.行列转换
目前的表结构为 name value字段,name为主键
里面的内容为
name value
-----------------
张三 3
李四 2
王五 1
现在需要得到这样的结果
张三 李四 王五
3 2 1里面的数据量不固顶,请问如何写出?谢谢各位大大指教.行列转换
嗯,发这个帖子之前我在论坛搜索了很久,但是因为小弟水平有限,搜索到的基本都是需求稍微复杂一些的,带group by的,我根据我的需求改了半天就是改不好
http://bbs.csdn.net/topics/390485454
之前看到这个帖子跟我的需求一样,不过是Access的,下面的答案我用到2005里执行不了,实在很着急才发帖
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 @sexec('select '+@s+' from test1 ')请参考:
http://bbs.csdn.net/topics/240002706
PIVOT (MAX([value]) FOR [name] in(张三,李四,王五))b
请教一下如果表里的数据库行数是不固定的,name也不仅仅是我罗列的这些,这样的话应该如何写呢?
谢谢你的回复,不过我使用了上面的动态方法后,因为我实际的表数据中的value是varchar类型且有中文值的,所以在使用max的时候报错了,请问这个应该怎么改呢?
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)
*/