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

付出一个表打横建成另外一张表

2013-09-24 
给出一个表打横建成另外一张表本帖最后由 chenfeng_cstp 于 2013-08-29 19:37:36 编辑现:表1aabbccHR知识2

给出一个表打横建成另外一张表
本帖最后由 chenfeng_cstp 于 2013-08-29 19:37:36 编辑 现:表1
aa        bb     cc
HR知识  2.0自我评价
HR知识  2.0上级评价
财务知识  2.0自我评价
财务知识  1.0上级评价
分析与诊断  2.0自我评价
分析与诊断  2.0上级评价
目标管理知  2.0自我评价


需要实现结果:表2
cc            HR知识         财务知识          分析与诊断          目标管理知
自我评价          2.0            2.0            2.0              2.0
上级评价          2.0            1.0            2.0

最好能够做成通用型语句,
打横最后能够随便制定一列,做表头 实用
[解决办法]

create table #tb(aa varchar(20),bb numeric(5,1),cc varchar(20))
insert into #tb
select 'HR知识',2.0,'自我评价'
union all select 'HR知识',2.0,'上级评价'
union all select '财务知识',2.0,'自我评价'
union all select '财务知识',1.0,'上级评价'
union all select '分析与诊断',2.0,'自我评价'
union all select '分析与诊断',2.0,'上级评价'
union all select '目标管理知',2.0,'自我评价'

declare @sql varchar(8000)
set @sql=''
select @sql=@sql + ',['+rtrim(aa)+']=max(case rtrim(aa) when '''+rtrim(aa)+''' then bb end)'
from #tb group by rtrim(aa)
exec('select cc'+@sql+' from #tb group by cc')


/*
ccHR知识财务知识分析与诊断目标管理知
上级评价2.01.02.0NULL
自我评价2.02.02.02.0
*/
[解决办法]

if OBJECT_ID('tempdb..#temp', 'u') is not null   drop table #temp; 


go
create table #temp( [aa] varchar(100), [bb] varchar(100), [cc] varchar(100));
insert #temp
select 'HR知识','2.0','自我评价' union all
select 'HR知识','2.0','上级评价' union all
select '财务知识','2.0','自我评价' union all
select '财务知识','1.0','上级评价' union all
select '分析与诊断','2.0','自我评价' union all
select '分析与诊断','2.0','上级评价' union all
select '目标管理知','2.0','自我评价' 

--SQL
DECLARE @sql NVARCHAR(MAX), @colList NVARCHAR(MAX)
SET @colList = STUFF((SELECT ','+QUOTENAME([aa]) FROM #temp GROUP BY aa FOR XML PATH('')),1,1,'')
SET @sql = N'
    select * from #temp a
    pivot
    (max(bb) for aa in('+ @colList +')) b
'
EXEC(@sql)

/*
ccHR知识财务知识分析与诊断目标管理知
上级评价2.01.02.0NULL
自我评价2.02.02.02.0
*/


[解决办法]
方法二:

select *
from 
(select cc  , rtrim(aa) as aa,sum(bb) as bb   
from #tb 
group by cc,rtrim(aa)
) as x
pivot (sum(bb)for aa in ([HR知识], [财务知识], [分析与诊断], [目标管理知]) ) as pvt
order by cc

/*
ccHR知识财务知识分析与诊断目标管理知
上级评价2.01.02.0NULL
自我评价2.02.02.02.0
*/

[解决办法]
我写的一篇博文,希望对你关于这个问题有所启示
http://blog.csdn.net/dotnetstudio/article/details/9856745
[解决办法]
引用:
Quote: 引用:

方法二:

select *
from 
(select cc  , rtrim(aa) as aa,sum(bb) as bb   
from #tb 
group by cc,rtrim(aa)
) as x
pivot (sum(bb)for aa in ([HR知识], [财务知识], [分析与诊断], [目标管理知]) ) as pvt
order by cc

/*
ccHR知识财务知识分析与诊断目标管理知
上级评价2.01.02.0NULL
自我评价2.02.02.02.0
*/



你用的SQL版本?pivot函数使用不了。我这里版本是2005和2008


我是用sql 2008版本的

热点排行