日期:2014-05-17  浏览次数:20456 次

请教大家一个行列转换问题,急.......


想问一下 怎么样将 filedCourseName 列转换成列 不同数据有50多个 
并且 根据查询条件不同 进行不同的转换 
比如 只查询计算机专业的 那么就只将计算机的 不同的数据 转换成列 
如果查询所有的专业 那就将所有的不同课程转换成列

请教一下大家该怎么做啊 很急....
------解决方案--------------------
我想可以以下几步

一步 检索 要转换成 列的 字段

然后 拼成SQL语句

最后 动态执行 EXEC 就可以了
------解决方案--------------------
先用个cte搭配where条件,筛选出你要转换的数据,再转换咯,你应该不会不懂得怎么写行转列吧?
------解决方案--------------------
这个我觉得使用动态SQL比较好,具体的事例如下



create table test(
name  varchar(20)
,class  varchar(20)
,score  numeric(6,2)

)
go
insert into test
values('张三','计算机基础',80)
,('张三','计算机应用',81.5)
,('张三','计算机组装',90)
,('张三','计算机开发',100)
,('李四','游戏机基础',50)
,('李四','游戏机应用',70)
,('李四','游戏机组装',73.5)
,('王五','游戏机开发',85)
,('王五','计算机基础',80)
,('王五','游戏机基础',80)

go
declare @SQL varchar(max)
set @SQL = ''
select @SQL= 'max(case  class  when '''+(select distinct class +''' then score else null end ) as '+ class +',max(case  class  when ''' from test as a for xml path ('')) 
select @SQL =LEFT(@SQL,LEN(@SQL)-LEN(',max(case  class  when '''))

set @SQL = 
'select name
,'+@SQL+'
from test
group by name'

exec(@SQL)



------解决方案--------------------
pivot
http://book.51cto.com/art/201002/183912.htm
------解决方案--------------------
select filedStudentNumber,filedName,filedSpecialityName,filedClassName
max(case filedCourseName when '計算機基礎' then filedScore else null end)計算機基礎,
max(case filedCourseName when '計算機開發' then filedScore else null end)計算機開發,
max(case filedCourseName when '計算機組裝' then filedScore else null end)計算機組裝,
max(case filedCourseName when '計算機應用' then filedScore else null end)計算機應用,
from table
group by filedStudentNumber,filedName,filedSpecialityName,filedClassName