日期:2014-05-19  浏览次数:20641 次

关于字段的转置
有一个表数据
t_a       t_b           t_c       t_d      

1           07-01       23         le
2           07-01       33         pa
3           07-01       12         du
4           07-02       45         le
5           07-02       23         pa
6           07-02       45         du

如何转换成

a         date       le     pa     du      
 
1       07-01       23     33     12
2       07-02       45     23     45

谢谢各位大哥帮忙

------解决方案--------------------
行转列。csdn上有很多,你搜索一下就有答案了。
不是不告诉你,而是你需要自己找答案
------解决方案--------------------
动态交叉表。

参考代码:

--动态生成交叉表
create table #t1 ( 姓名 varchar (50) null , 性别 varchar (50) null , 国籍 int null , 金额 int null )

insert #t1 ( 姓名 , 性别 , 国籍 , 金额 ) values ( 'a ' , '男 ' , 1 , 20 )
insert #t1 ( 姓名 , 性别 , 国籍 , 金额 ) values ( 'b ' , '女 ' , 2 , 10 )
insert #t1 ( 姓名 , 性别 , 国籍 , 金额 ) values ( 'c ' , '女 ' , 1 , 30 )


create table #t2 ( 国籍标识 int null , 名称 varchar (50) null )

insert #t2 ( 国籍标识 , 名称 ) values ( 1 , '中国 ' )
insert #t2 ( 国籍标识 , 名称 ) values ( 2 , '美国 ' )

declare @s varchar(8000), @s2 varchar(8000)

set @s = ' '
select @s = @s+ ', '+quotename(isnull(min(#t2.名称), ' ') + '金额 ')+ '=sum(case #t1.国籍 when ' ' '+cast(#t1.国籍 as varchar(20))+ ' ' ' then 金额 else 0 end) '
from #t1 inner join #t2 on #t1.国籍=#t2.国籍标识
group by #t1.国籍
order by #t1.国籍

set @s = 'select 性别 '+@s+ ' from #t1 group by 性别 '
print @s

set @s2= ' '
select @s2 = @s2+ ', '+quotename(isnull(min(#t2.名称), ' ') + '金额 ')+ '=sum(case #t1.国籍 when ' ' '+cast(#t1.国籍 as varchar(20))+ ' ' ' then 金额 else 0 end) '
from #t1 inner join #t2 on #t1.国籍=#t2.国籍标识
group by #t1.国籍
order by #t1.国籍

set @s2 = 'select ' '合计 ' ' as 性别 '+@s2+ ' from #t1 '
print @s2

exec( 'select * from ( ' + @s + ' union ' + @s2 + ') tt order by 性别 desc ')


drop table #t1
drop table #t2


/*
中国金额 美国金额
--------------------------------------
女 30 10
男 20 0
合计 50 10
*/
------解决方案--------------------
create table T(t_a int, t_b varchar(10), t_c int, t_d varchar(10))
insert T select 1, '07-01 ', 23, 'le '
union all select 2, '07-01 ', 33, 'pa '
union all select 3, '07-01 ', 12, 'du '
union all select 4, '07-02 ', 45, 'le '
union all select 5, '07-02 ', 23, 'pa '
union all select 6, '07-02 ', 45, 'du '