我想问一下如何用sql命令来转置数据库?比如原来数据库有几条记录如下:
甲 有钱 有车
乙 有车
丙 有房 有车
丁 有儿我想转置为如下:
有车 甲 乙 丙
有房 丙
有钱 甲
有儿 丁不知道如何实现?用笨的方法可以,比如循环,但是效率太低了,有没有简单的方法请大家帮忙!

解决方案 »

  1.   

    create table tb(name char(2), col1 varchar(10) , col2 varchar(10))
    insert into tb values('甲', '有钱', '有车') 
    insert into tb values('乙', '有车', '')
    insert into tb values('丙', '有房', '有车') 
    insert into tb values('丁', '有儿', '')
    go--将原来的数据做成一个临时表
    select * into tb1 from 
    (
      select name , col1 from tb where col1 <> ''
      union all
      select name , col2 as col1 from tb where col2 <> ''
    ) n --SQL 2000 静态SQL
    select col1 , 
    max(case px when 1 then name else '' end) name1,
    max(case px when 2 then name else '' end) name2,
    max(case px when 3 then name else '' end) name3
    from
    (
      select m.* , px = (select count(1) from tb1 n where n.col1 = m.col1 and name < m.name) + 1 from tb1 m
    ) t
    group by col1--SQL 2000 动态SQL
    declare @sql varchar(8000)
    set @sql = 'select col1 '
    select @sql = @sql + ' , max(case px when ''' + cast(px as varchar) + ''' then name else '''' end) [name' + cast(px as varchar) + ']'
    from (select distinct px from (select m.* , px = (select count(1) from tb1 n where n.col1 = m.col1 and name < m.name) + 1 from tb1 m) t) as a
    set @sql = @sql + ' from (select m.* , px = (select count(1) from tb1 n where n.col1 = m.col1 and name < m.name) + 1 from tb1 m) t group by col1'
    exec(@sql) drop table tb,tb1/*
    col1       name1 name2 name3 
    ---------- ----- ----- ----- 
    有车         丙     甲     乙
    有儿         丁             
    有房         丙             
    有钱         甲     
    */