日期:2014-05-18  浏览次数:20381 次

行列转换问题进阶篇
表table1
      id     name     itemName   scores
        1       张三       语文         80
        1       张三       数学         90
        1       张三       外语         100
        2       李四       语文         88
        2       李四       数学         99
        2       李四       外语         66
现在我已经实现了行列转换
declare   @sql   nvarchar(1000)
set   @sql= 'select   ID,Name '
select   @sql=@sql   + ',sum(case   ItemName   when   ' ' '+ItemName   + ' ' 'then   scores     end)[ '   +ItemName   + '] '
from   (select   distinct   ItemName   from   table1)   as   a
select   @sql=@sql   +   '     from   table1   group   by   ID,Name '
exec(@sql)
    id     name       语文     数学     外语  
      1       张三       80         90         100
      2       李四       88           99       66

现在我的问题是   如何对列   "语文 ", "数学 ", "外语 "   进行排序,例如   现在的顺序是:
语文   数学   外语   ,如何改成     外语   语文   数学

------解决方案--------------------
將你的

declare @sql nvarchar(1000)
set @sql= 'select ID,Name '
select @sql=@sql + ',sum(case ItemName when ' ' '+ItemName + ' ' 'then scores end)[ ' +ItemName + '] '
from (select distinct ItemName from table1) as a
select @sql=@sql + ' from table1 group by ID,Name '
exec(@sql)

改為

Select OrderID = Identity(Int, 1, 1), * Into #T From table1

declare @sql nvarchar(1000)
set @sql= 'select ID,Name '
select @sql=@sql + ',sum(case ItemName when ' ' '+ItemName + ' ' 'then scores end)[ ' +ItemName + '] '
from #T Group By ItemName Order By Min(OrderID)
select @sql=@sql + ' from table1 group by ID,Name order by ID '
exec(@sql)

Drop Table #T
即可
------解决方案--------------------
鱼啊,楼主要求的排序是指定的,用临时表没法指定各个课程的先后啊.