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