行转列

     测试数据(学生成绩表)建表及初始化数据略过,具体数据如下:

     Table Score:

      Name            Course           Score

      张三               语文                 80

      张三               数学                 75

      李四               语文                 65

      李四               数学                 85

      李四               英语                 88

      SQL  2000(行转列)的解决方法(聚合函数配合Case语句实现)

         1.静态SQL      

select Name,
       Sum(Case Course when '语文' then Score else 0 end) as '语文',
       Sum(Case Course when '数学' then Score else 0 end) as '数学',
       Sum(Case Course when '英语' then Score else 0 end) as '英语'
from Score group by Name

     2.动态SQL

declare @sql varchar(500)
declare @courseStr varchar(300)
set @sql='select Name'
set @courseStr=''
select @courseStr=@courseStr+',sum(case course when '''+Course+''' then score then 0 end) as '+Course+' ' 
from (select distinct Course from Score) a
set @sql=@sql+@courseStr+' from Score group by Name'
exec(@sql)

  SQL 2005(行转列)的解决方法(PIVOT()函数)

         1.静态SQL

select  a.* from Score pivot(sum(Score)  for Course in(语文,数学,英语)) as a

         2.动态SQL

declare @sql varchar(500)
select @sql=isnull(@sql+',','')+quotename(Course) from (select distinct Course from Score) a
set @sql='select b.* from Score pivot(sum(Score) for Course in('+@sql+')) b'
exec(@sql)

     列转行

     测试数据(学生成绩表)建表及初始化数据略过,具体数据如下:

     Table Score:

      Name             语文               数学                英语

      张三                80                 75                   0

      李四                65                 85                  88      

       SQL 2000(行转列)的解决方法(Union语句)

         1.静态SQL

select Name,Course='语文',语文 as Score from Score
union all select Name,Course='数学',数学 as Score from Score
union all select Name,Course='英语',英语 as Score from Score

         2.动态SQL

declare @sql varchar(500)
select @sql=isnull(@sql+' union all ','')+'select Name,'''+name+''' as Course,'+name+' as Score from Score'  from Syscolumns where id=object_id('Score') and name!='name'
exec(@sql)

       SQL 2005(列转行)的解决方法(UNPIVOT()函数)

         1.静态SQL

select Name,Course,Score from Score unpivot(Score for Course in(语文,数学,英语)) t

         2.动态SQL

declare @sql varchar(500)
select @sql=isnull(@sql+',','')+name from syscolumns where id=object_id('Score') and name!='Name'
set @sql='select Name,Course,Score from Score unpivot(Score for Course in('+@sql+')) a'
exec(@sql)

  总结:

     sql server 2005的pivot()和unpivot()函数使得行专列或列转行变得简单。

      Pivot()语法:

      table_source

      Pivot(

           聚合函数(value_column)

           for pivot_column

           in(<column_list>)

        )

      table_resource为行转列的数据源,聚合函数(value_column)填充行转列之后的数据,Pivot_column为原表中数据要转为列所在的列名,<column_list>为最终转换之后的列名集(数据源表中存在的数据)。

      unpivot()语法:

      table_resource

      unpivot

      (

           value_column

           for pivot_column

            in(<column_list)

       )

      table_resource为列转行的数据源,value_column填充列转行之后的数据所在的列名,Pivot_column为原表中要转为行数据的列,<column_list>为最终要转换为行数据的列名集(数据源表中存在的数据)。

      动态列转行中,利用syscolumns表可以数据源表的列名,具体语法:select * from syscolumns where id=object_id(table)

 posted on 2014-05-17 11:50  会飞的金鱼  阅读(235)  评论(0)    收藏  举报