行转列
测试数据(学生成绩表)建表及初始化数据略过,具体数据如下:
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
浙公网安备 33010602011771号