数据库是SQL 2005
目前的表结构为 name value字段,name为主键
里面的内容为
name        value
-----------------
张三         3
李四         2
王五         1
现在需要得到这样的结果
张三    李四   王五
 3       2     1里面的数据量不固顶,请问如何写出?谢谢各位大大指教.行列转换

解决方案 »

  1.   

    又见行转列,论坛里有很多,建议自己找找看看。http://bbs.csdn.net/topics/390490263
      

  2.   


    嗯,发这个帖子之前我在论坛搜索了很久,但是因为小弟水平有限,搜索到的基本都是需求稍微复杂一些的,带group by的,我根据我的需求改了半天就是改不好
    http://bbs.csdn.net/topics/390485454
    之前看到这个帖子跟我的需求一样,不过是Access的,下面的答案我用到2005里执行不了,实在很着急才发帖
      

  3.   

    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 @sexec('select '+@s+' from test1 ')请参考:
    http://bbs.csdn.net/topics/240002706
      

  4.   

    http://www.cnblogs.com/IcefishBingqing/archive/2010/12/22/1913349.htmlSql 行转列问题总结,供楼主参考!
      

  5.   

    SELECT * FROM test1 
    PIVOT (MAX([value]) FOR [name] in(张三,李四,王五))b
      

  6.   


    请教一下如果表里的数据库行数是不固定的,name也不仅仅是我罗列的这些,这样的话应该如何写呢?
      

  7.   


    谢谢你的回复,不过我使用了上面的动态方法后,因为我实际的表数据中的value是varchar类型且有中文值的,所以在使用max的时候报错了,请问这个应该怎么改呢?
      

  8.   


    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)
    */