首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

关于字段的转置解决方案

2012-02-05 
关于字段的转置有一个表数据t_at_bt_ct_d107-0123le207-0133pa307-0112du407-0245le507-0223pa607-0245du

关于字段的转置
有一个表数据
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 '



declare @sql varchar(8000)
set @sql= 'select t_a=min(t_a), t_b, '
select @sql=@sql+quotename(t_d)+ '=max(case when t_d= '+quotename(t_d, ' ' ' ')+ ' then t_c end), '
from T
group by t_d
select @sql=left(@sql, len(@sql)-1), @sql=@sql+ ' from T group by t_b '
exec(@sql)
[解决办法]
行列转换,太多例子了

热点排行
Bad Request.